home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-131 < prev    next >
Text File  |  1996-01-11  |  149KB  |  3,432 lines

  1. C.S.M.P. Digest             Thu, 11 Jan 96       Volume 3 : Issue 131
  2.  
  3. Today's Topics:
  4.  
  5.         (Safely) Drawing directly to VRAM
  6.         ANSWER: Get dirID from FSSpec
  7.         Animation Libraries
  8.         Changing the size of balloon help
  9.         Need to unlock MF Temp Memory?
  10.         New Mac games programming web site!
  11.         Script Editor Apple Events
  12.         [ANN] Mops 2.7 Macintosh Programming Environment
  13.  
  14.  
  15.  
  16. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  17. (pottier@clipper.ens.fr).
  18.  
  19. The digest is a collection of article threads from the internet
  20. newsgroups comp.sys.mac.programmer.help, csmp.tools, csmp.misc and
  21. csmp.games. It is designed for people who read news semi-regularly and
  22. want an archive of the discussions.  If you don't know what a
  23. newsgroup is, you probably don't have access to it. Ask your systems
  24. administrator(s) for details. If you don't have access to news, you
  25. may still be able to post messages to the group by using a mail server
  26. like anon.penet.fi (mail help@anon.penet.fi for more information).
  27.  
  28. Each issue of the digest contains one or more sets of articles (called
  29. threads), with each set corresponding to a 'discussion' of a particular
  30. subject.  The articles are not edited; all articles included in this digest
  31. are in their original posted form (as received by our news server at
  32. nef.ens.fr).  Article threads are not added to the digest until the last
  33. article added to the thread is at least two weeks old (this is to ensure that
  34. the thread is dead before adding it to the digest).  Article threads that
  35. consist of only one message are generally not included in the digest.
  36.  
  37. The digest is officially distributed by two means, by email and ftp.
  38.  
  39. If you want to receive the digest by mail, send email to listserv@ens.fr
  40. with no subject and one of the following commands as body:
  41.     help                                Sends you a summary of commands
  42.     subscribe csmp-digest Your Name     Adds you to the mailing list
  43.     signoff csmp-digest                 Removes you from the list
  44. Once you have subscribed, you will automatically receive each new
  45. issue as it is created.
  46.  
  47. The official ftp info is ftp://ftp.dartmouth.edu/pub/csmp-digest.
  48. Questions related to the ftp site should be directed to
  49. scott.silver@dartmouth.edu.
  50.  
  51. -------------------------------------------------------
  52.  
  53. >From ericd@ra.nilenet.com (Eric A. Drumbor)
  54. Subject: (Safely) Drawing directly to VRAM
  55. Date: Wed, 06 Dec 1995 20:16:30 -0700
  56. Organization: BW Software
  57.  
  58.      Yes, I know that this has been discussed before, but I'm going to dig
  59. it up again :-)
  60.  
  61.      I *must* copy directly to the screen.  My frame updates/changes are
  62. too small and too spread out to use CopyBits.  In other words, by using
  63. CopyBits I'm probably copying about 20% - 50% more pixels than I really
  64. need to move (if I use a single Rect or a series of Rects), besides the
  65. fact that the overhead alone when making a few hundred copies per frame
  66. would crush my presently decent frame rate.  So.....I made a simple delta
  67. copying function (albeit somewhat crappy), and I'm writing directly to the
  68. video memory.  
  69.  
  70.      What are the odds this puppy will crash?  I see more of the
  71. mainstream games using this method, and I assume that these games aren't
  72. using CopyBits to copy two pixels on a scanline, then do the same for a
  73. few hundred more scanlines.  The overhead for something like this would be
  74. outrageous, so they *must* be writing to the video ram.
  75.  
  76.      How are these companies staying compatable with all the different
  77. Macs and video configs?  Is there some kind of magic function to prevent
  78. disaster when trying to write to the video memory of a video card? I've
  79. been obtaining the base address of the screen via a few QD calls, finally
  80. getting the base address from a PixMap handle.  So far this has worked,
  81. but I'm afraid that later on down the road this will crash and burn
  82. horribly.  What can I do to stay compatable while avoiding CopyBits?
  83.  
  84. -- 
  85. "Once in a while, a notty little boy loses it and comes after Santa"
  86. Eric A. Drumbor      
  87. ericd@ra.nilenet.com                 <http://www.nilenet.com/~ericd/>
  88. BW Software
  89.  
  90. +++++++++++++++++++++++++++
  91.  
  92. >From jmunkki@gamma.hut.fi (Juri Munkki)
  93. Date: 7 Dec 1995 21:54:19 GMT
  94. Organization: Helsinki University of Technology
  95.  
  96. In article <ericd-0612952016300001@slip13.nilenet.com> ericd@ra.nilenet.com (Eric A. Drumbor) writes:
  97. >horribly.  What can I do to stay compatable while avoiding CopyBits?
  98.  
  99. Read http://www.hut.fi/~jmunkki/misc/direct_mac_screen_access.txt
  100.  
  101. -- 
  102. Juri Munkki jmunkki@iki.fi      In cyberspace everyone can hear you scream.
  103. http://www.iki.fi/~jmunkki              Windsurfing: Faster than the wind.
  104.  
  105. +++++++++++++++++++++++++++
  106.  
  107. >From hnsngr@sirius.com (Ron Hunsinger)
  108. Date: Sun, 10 Dec 1995 04:43:41 -0800
  109. Organization: ErsteSoft
  110.  
  111. In article <ericd-0612952016300001@slip13.nilenet.com>,
  112. ericd@ra.nilenet.com (Eric A. Drumbor) wrote:
  113.  
  114. >      Yes, I know that this has been discussed before, but I'm going to dig
  115. > it up again :-)
  116. >      I *must* copy directly to the screen.>
  117.  
  118. No you don't. You can use CopyBits.
  119.  
  120. > My frame updates/changes are
  121. > too small and too spread out to use CopyBits.
  122.  
  123. If that's true, then updating the screen is not your bottleneck. "Small
  124. and spread out" means you aren't updating very many pixels.
  125.  
  126. > In other words, by using
  127. > CopyBits I'm probably copying about 20% - 50% more pixels than I really
  128. > need to move (if I use a single Rect or a series of Rects), besides the
  129. > fact that the overhead alone when making a few hundred copies per frame
  130. > would crush my presently decent frame rate.  So.....I made a simple delta
  131. > copying function (albeit somewhat crappy), and I'm writing directly to the
  132. > video memory.  
  133. >      What are the odds this puppy will crash?
  134.  
  135. 100%. Guaranteed. Sorry to sound so pessimistic, but some of us still have
  136. the battle scars from ignoring Apple's advice not to write directly to the
  137. screen. It's good advice. Heed it.
  138.  
  139. Video memory will not always be memory mapped. Even if it is, it will not
  140. always be writable. As memory protection improves (as it must if Apple
  141. wants to make these machines more robust), VRAM won't always be in your
  142. process' address space, even if it remains in the machine's address space.
  143.  
  144. > I see more of the
  145. > mainstream games using this method, and I assume that these games aren't
  146. > using CopyBits to copy two pixels on a scanline, then do the same for a
  147. > few hundred more scanlines.  The overhead for something like this would be
  148. > outrageous, so they *must* be writing to the video ram.
  149.  
  150. How are you "seeing" games use this method. Did you disassemble the code,
  151. or trace it? If you had, you would *know* whether they were using
  152. CopyBits, without having to make assumptions.
  153.  
  154. >      How are these companies staying compatable with all the different
  155. > Macs and video configs? 
  156.  
  157. CopyBits will always be able to write to the screen, even when the day
  158. comes that you can't.
  159.  
  160. > Is there some kind of magic function to prevent
  161. > disaster when trying to write to the video memory of a video card?
  162.  
  163. Yes. It's called CopyBits.
  164.  
  165. > I've
  166. > been obtaining the base address of the screen via a few QD calls, finally
  167. > getting the base address from a PixMap handle.  So far this has worked,
  168. > but I'm afraid that later on down the road this will crash and burn
  169. > horribly.  What can I do to stay compatable while avoiding CopyBits?
  170.  
  171. You can't. Nor do you have to. CopyBits is not really that slow.
  172.  
  173. In fact, I once wrote a benchmark where I put CopyBits head-to-head
  174. against a handcrafted assembler routine to copy a full screen image
  175. directly to the screen of a Mac Plus. The assembler routine used a
  176. sequence of 32 MOVE.L (A0)+,(A1)+ instructions to copy each pair of
  177. scanlines (32 x 32 = 1024 = 2 * 512), in a loop that repeated 171 times.
  178. You can't get much tighter than that. But you know what? CopyBits beat it!
  179. It turns out that, on a Mac Plus at least, CopyBits really is unbeatable.
  180.  
  181. Now I'm not claiming on the basis of that experiment that CopyBits is
  182. always unbeatable. Far from it. This is a trick result. It turns out that
  183. on a Plus, ROM is faster than RAM because it doesn't have to compete with
  184. video refresh. Consequently, code in ROM (like CopyBits) has a slight edge
  185. (about 20%) over code in RAM (like my assembler routine). The Plus also
  186. does not support Color QuickDraw, so the CopyBits on that machine doesn't
  187. have to mess with Palettes and ColorTables and all that sort of stuff.
  188.  
  189. But I do want you to notice two key points, that are relevant beyond the
  190. Mac Plus:
  191.  
  192. a) Sure, CopyBits had a 20% advantage in code access, but it had no advantage
  193.    in data accesses, it is much more general-purpose, yet despite all that it 
  194.    still beat my code by several percent. It did not fritter away its 
  195.    advantage through inefficiency.
  196.  
  197. b) CopyBits, being in ROM, can be tailored specifically for the machine it's
  198.    running on. It will run on a 68000, it will use 68020 instructions on an
  199.    '020, it runs native on a PowerMac. Because each ROM is specific to the
  200.    machine it's installed in, ROM routines like CopyBits can safely do
  201.    optimizations that you don't dare attempt, unless you're willing to ship
  202.    your product with a dozen hand-tailored routines, each optimized for a
  203.    different machine, including machines that haven't even been designed yet.
  204.    Quite an undertaking.
  205.  
  206. Apple is fully aware of the importance of CopyBits. You can be sure that
  207. on any machine they write the ROM for, CopyBits and BlockMove will be
  208. optimized for that machine to within an inch of their lives. 
  209.  
  210. You can help, though. When you call CopyBits, make sure the rectangles are
  211. aligned to nice machine boundaries. In B/W, this means you widen the
  212. rectangles if necessary so the left and right edges are longword aligned.
  213. Even though this means you'll be copying more pixels, it'll actually be
  214. faster because CopyBits won't have to do any masking. On an '040, give
  215. CopyBits the opportunity to use a MOVE16 instruction. On a PowerMac, align
  216. the rectangle boundaries to double-words, matching the width of the data
  217. bus. (You can ignore cache row boundaries, since video is never cached.
  218. Caching video would slow the machine to a crawl.)
  219.  
  220. Your best bet is to draw to an offscreen buffer (a GWorld), which you
  221. conceptually divide into a number of nicely aligned rectangles. Keep track
  222. of which rectangles are "dirty". (If you change any pixel in a rectangle,
  223. the whole thing is dirty.) Then use CopyBits to copy the dirty rectangles
  224. to the screen. Coalesce adjacent dirty rectangles when you can, to reduce
  225. the number of calls. Make sure the source and destination have the same
  226. ColorTable, so CopyBits can know that it doesn't have to translate color
  227. indexes. 
  228.  
  229. If your game draws into a movable window that is smaller than the screen
  230. (always a nice courtesy), make sure the window remains aligned to nice
  231. boundaries. If the user drags the window, snap it to a nice boundary.
  232. HyperCard does this, for example. This guarantees that CopyBits won't have
  233. to shift the data while it moves it. Alternatively, make the GWorld a
  234. little bigger than the window, so you can shift the window contents in the
  235. GWorld to align them with the window contents on the screen.
  236.  
  237. -Ron Hunsinger
  238.  
  239. +++++++++++++++++++++++++++
  240.  
  241. >From pottier@fregate.ens.fr (Francois Pottier)
  242. Date: 10 Dec 1995 21:13:24 GMT
  243. Organization: Ecole Normale Superieure, Paris
  244.  
  245. In article <hnsngr-1012950443410001@ppp017-sf2.sirius.com>,
  246. Ron Hunsinger <hnsngr@sirius.com> wrote:
  247.  
  248. >If that's true, then updating the screen is not your bottleneck. "Small
  249. >and spread out" means you aren't updating very many pixels.
  250.  
  251. Yes, he isn't, and that's precisely why CopyBits is slow for him.
  252. Overall, I agree with you, and I would recommend using CopyBits
  253. whenever possible. It is true that CopyBits can't be beat for large
  254. screen areas, as your test on a MacPlus shows; however, it can be beat
  255. for small amounts of data, because it spends a relatively long time
  256. setting things up before actually starting to copy. I'm no blitting
  257. specialist, but I would recommend reading a Develop article on
  258. CopyBits and its performance (sorry, I don't remember the issue
  259. number).
  260.  
  261. -- 
  262. Francois
  263. pottier@dmi.ens.fr
  264. http://www.eleves.ens.fr:8080/home/pottier/
  265.  
  266. +++++++++++++++++++++++++++
  267.  
  268. >From hnsngr@sirius.com (Ron Hunsinger)
  269. Date: Sun, 10 Dec 1995 22:59:11 -0800
  270. Organization: ErsteSoft
  271.  
  272. In article <4afihk$g0g@nef.ens.fr>, pottier@fregate.ens.fr (Francois
  273. Pottier) wrote:
  274.  
  275. > In article <hnsngr-1012950443410001@ppp017-sf2.sirius.com>,
  276. > Ron Hunsinger <hnsngr@sirius.com> wrote:
  277. > >If that's true, then updating the screen is not your bottleneck. "Small
  278. > >and spread out" means you aren't updating very many pixels.
  279. > Yes, he isn't, and that's precisely why CopyBits is slow for him.
  280. > Overall, I agree with you, and I would recommend using CopyBits
  281. > whenever possible. It is true that CopyBits can't be beat for large
  282. > screen areas, as your test on a MacPlus shows; however, it can be beat
  283. > for small amounts of data, because it spends a relatively long time
  284. > setting things up before actually starting to copy. I'm no blitting
  285. > specialist, but I would recommend reading a Develop article on
  286. > CopyBits and its performance (sorry, I don't remember the issue
  287. > number).
  288.  
  289. On small areas, the speed of CopyBits *per pixel* may be low, but if he
  290. isn't updating very many pixels it doesn't matter. The total time spent
  291. updating the screen, whether with CopyBits or otherwise, should remain
  292. small.
  293.  
  294. -Ron Hunsinger
  295.  
  296. +++++++++++++++++++++++++++
  297.  
  298. >From christer@cs.umu.se (Christer Ericson)
  299. Date: Mon, 11 Dec 1995 12:57:41 GMT
  300. Organization: Dept. of Computing Science, Umea Univ., 901 87 Umea, Sweden
  301.  
  302. In <hnsngr-1012950443410001@ppp017-sf2.sirius.com> hnsngr@sirius.com (Ron Hunsinger) writes:
  303. >[...]
  304. >In fact, I once wrote a benchmark where I put CopyBits head-to-head
  305. >against a handcrafted assembler routine to copy a full screen image
  306. >directly to the screen of a Mac Plus. The assembler routine used a
  307. >sequence of 32 MOVE.L (A0)+,(A1)+ instructions to copy each pair of
  308. >scanlines (32 x 32 = 1024 = 2 * 512), in a loop that repeated 171 times.
  309. >You can't get much tighter than that. But you know what? CopyBits beat it!
  310. >It turns out that, on a Mac Plus at least, CopyBits really is unbeatable.
  311. >
  312. >Now I'm not claiming on the basis of that experiment that CopyBits is
  313. >always unbeatable. Far from it. This is a trick result. It turns out that
  314. >on a Plus, ROM is faster than RAM because it doesn't have to compete with
  315. >video refresh. Consequently, code in ROM (like CopyBits) has a slight edge
  316. >(about 20%) over code in RAM (like my assembler routine). The Plus also
  317. >does not support Color QuickDraw, so the CopyBits on that machine doesn't
  318. >have to mess with Palettes and ColorTables and all that sort of stuff.
  319. >[...]
  320.  
  321. Another reason for your routine to come out slower than copybits is that
  322. your code was not very well optimized. You should have used MOVEM with as
  323. many registers as possible.
  324.  
  325. Of course, that's another point in favor of using copybits: if you're
  326. not a really good programmer, chances are that your "optimized" blitter
  327. will be less optimized than CopyBits.
  328.  
  329.  
  330. Christer Ericson <This space for hire!> http://www.cs.umu.se/~christer/
  331. phone: +46-90-16 67 94, fax: +46-90-16 61 26, email: christer@cs.umu.se
  332. Department of Computing Science, Umea University, S-901 87 UMEA, SWEDEN
  333.  
  334. +++++++++++++++++++++++++++
  335.  
  336. >From elliott@mpi-muelheim.mpg.de (Mark Elliott)
  337. Date: 11 Dec 1995 18:24:01 GMT
  338. Organization: Max-Planck-Institut f. Kohlenforsch. Muelheim
  339.  
  340. In article <hnsngr-1012950443410001@ppp017-sf2.sirius.com>,
  341. hnsngr@sirius.com (Ron Hunsinger) wrote:
  342.  
  343. > In article <ericd-0612952016300001@slip13.nilenet.com>,
  344. > ericd@ra.nilenet.com (Eric A. Drumbor) wrote:
  345. > >      Yes, I know that this has been discussed before, but I'm going to dig
  346. > > it up again :-)
  347. > > 
  348. > >      I *must* copy directly to the screen.>
  349. > No you don't. You can use CopyBits.
  350.  
  351. Oh come on Ron. Apple have published guidelines for direct-to-screen drawing.
  352.  
  353. For a game I am writing there is simply no way I could get acceptable
  354. frame rates using copybits. Even drawing directly into vram was a push.
  355. Now, a game which would have required a 68040 as minimum will run happily
  356. on a 25 MHz 68030. This has to be a consideration.
  357.  
  358. Direct to screen drawing is not dangerous. Yeah, I am sure that some
  359. hardware configurations (eg. strange graphics accelerators) MIGHT cause
  360. problems. However, after the initial teething troubles (which are
  361. certainly not unique to vram access) I have had essentially NO crashes. I
  362. have tested my game on a wide range of 68K and powerpc macs with a fair
  363. selection of monitor sizes.
  364.  
  365. > > My frame updates/changes are
  366. > > too small and too spread out to use CopyBits.
  367. > If that's true, then updating the screen is not your bottleneck. "Small
  368. > and spread out" means you aren't updating very many pixels.
  369.  
  370. And updating them using a single copybits is moving far too many bytes.
  371. Sure you could keep track of which pixels are modified. I assume you are
  372. creating your screen in a gworld and then copying to the screen. If you
  373. keep track of which pixels are modified (or Rects around them) then only
  374. CopyBits the parts which you need to, this might help. However, by the
  375. sound of things, these will be small areas - this is where CopyBits
  376. performs at its worst.
  377.  
  378. > > In other words, by using
  379. > > CopyBits I'm probably copying about 20% - 50% more pixels than I really
  380. > > need to move (if I use a single Rect or a series of Rects), besides the
  381. > > fact that the overhead alone when making a few hundred copies per frame
  382. > > would crush my presently decent frame rate.  So.....I made a simple delta
  383. > > copying function (albeit somewhat crappy), and I'm writing directly to the
  384. > > video memory.  
  385. > > 
  386. > >      What are the odds this puppy will crash?
  387. > 100%. Guaranteed. Sorry to sound so pessimistic, but some of us still have
  388. > the battle scars from ignoring Apple's advice not to write directly to the
  389. > screen. It's good advice. Heed it.
  390.  
  391. If programmed properly it is no more likely to crash than any other program.
  392.  
  393. As I said, Apple have published guidelines for direct-to-screen drawing
  394. (an issue of Develop. Eric, mail me and I will try to help you out with
  395. references/code). They recommend that you don't do it, but at least they
  396. tell you the safe way to do it.
  397.  
  398.  
  399. > Video memory will not always be memory mapped. Even if it is, it will not
  400. > always be writable. As memory protection improves (as it must if Apple
  401. > wants to make these machines more robust), VRAM won't always be in your
  402. > process' address space, even if it remains in the machine's address space.
  403. > > I see more of the
  404. > > mainstream games using this method, and I assume that these games aren't
  405. > > using CopyBits to copy two pixels on a scanline, then do the same for a
  406. > > few hundred more scanlines.  The overhead for something like this would be
  407. > > outrageous, so they *must* be writing to the video ram.
  408. > How are you "seeing" games use this method. Did you disassemble the code,
  409. > or trace it? If you had, you would *know* whether they were using
  410. > CopyBits, without having to make assumptions.
  411.  
  412. I have disassembled many action games. In almost all cases, games which
  413. are highly rated (eg. the Ambrosia games) use direct to screen drawing. I
  414. have yet to see one of these games crash.
  415.  
  416. > >      How are these companies staying compatable with all the different
  417. > > Macs and video configs? 
  418. > CopyBits will always be able to write to the screen, even when the day
  419. > comes that you can't.
  420.  
  421. They are using GetBaseAddr to find the address of screen memory. They
  422. check the device list to find a screen which supports the required depth
  423. and has the required size. They check the pixMap to find the rowBytes
  424. value. Then they make sure that there is no way their drawing will be
  425. outside of the screen memory.
  426.  
  427. > > Is there some kind of magic function to prevent
  428. > > disaster when trying to write to the video memory of a video card?
  429. > Yes. It's called CopyBits.
  430.  
  431. Sure this will prevent disaster, but it may also prevent acceptable performance.
  432.  
  433. > > I've
  434. > > been obtaining the base address of the screen via a few QD calls, finally
  435. > > getting the base address from a PixMap handle.  So far this has worked,
  436. > > but I'm afraid that later on down the road this will crash and burn
  437. > > horribly.  What can I do to stay compatable while avoiding CopyBits?
  438. > You can't. Nor do you have to. CopyBits is not really that slow.
  439.  
  440. > In fact, I once wrote a benchmark where I put CopyBits head-to-head
  441. > against a handcrafted assembler routine to copy a full screen image
  442. > directly to the screen of a Mac Plus. The assembler routine used a
  443. > sequence of 32 MOVE.L (A0)+,(A1)+ instructions to copy each pair of
  444. > scanlines (32 x 32 = 1024 = 2 * 512), in a loop that repeated 171 times.
  445. > You can't get much tighter than that. But you know what? CopyBits beat it!
  446. > It turns out that, on a Mac Plus at least, CopyBits really is unbeatable.
  447.  
  448. I think I know what went wrong here. You unwrapped the loop. Yeah,
  449. everyone says you should do this. It is usually faster. However if you
  450. unwrap the loop to the extent that the loop is larger than the processors
  451. cache, it will have to reload the code possibly several times per loop.
  452.  
  453. Also, copying large areas is where CopyBits wins. Try copying a 24 x 24
  454. sprite using a custom blitter or using copybits. If you can get CopyBits
  455. to perform at half the speed of your blitter you should write a better
  456. blitter.
  457.  
  458. > Now I'm not claiming on the basis of that experiment that CopyBits is
  459. > always unbeatable. Far from it. This is a trick result. It turns out that
  460. > on a Plus, ROM is faster than RAM because it doesn't have to compete with
  461. > video refresh. Consequently, code in ROM (like CopyBits) has a slight edge
  462. > (about 20%) over code in RAM (like my assembler routine). The Plus also
  463. > does not support Color QuickDraw, so the CopyBits on that machine doesn't
  464. > have to mess with Palettes and ColorTables and all that sort of stuff.
  465. > But I do want you to notice two key points, that are relevant beyond the
  466. > Mac Plus:
  467. > a) Sure, CopyBits had a 20% advantage in code access, but it had no advantage
  468. >    in data accesses, it is much more general-purpose, yet despite all that it 
  469. >    still beat my code by several percent. It did not fritter away its 
  470. >    advantage through inefficiency.
  471. > b) CopyBits, being in ROM, can be tailored specifically for the machine it's
  472. >    running on. It will run on a 68000, it will use 68020 instructions on an
  473. >    '020, it runs native on a PowerMac. Because each ROM is specific to the
  474. >    machine it's installed in, ROM routines like CopyBits can safely do
  475. >    optimizations that you don't dare attempt, unless you're willing to ship
  476. >    your product with a dozen hand-tailored routines, each optimized for a
  477. >    different machine, including machines that haven't even been designed yet.
  478. >    Quite an undertaking.
  479. > Apple is fully aware of the importance of CopyBits. You can be sure that
  480. > on any machine they write the ROM for, CopyBits and BlockMove will be
  481. > optimized for that machine to within an inch of their lives.
  482.  
  483. As optimised as a very general routine can be.
  484.  
  485. > You can help, though. When you call CopyBits, make sure the rectangles are
  486. > aligned to nice machine boundaries. In B/W, this means you widen the
  487. > rectangles if necessary so the left and right edges are longword aligned.
  488. > Even though this means you'll be copying more pixels, it'll actually be
  489. > faster because CopyBits won't have to do any masking. On an '040, give
  490. > CopyBits the opportunity to use a MOVE16 instruction. On a PowerMac, align
  491. > the rectangle boundaries to double-words, matching the width of the data
  492. > bus. (You can ignore cache row boundaries, since video is never cached.
  493. > Caching video would slow the machine to a crawl.)
  494. > Your best bet is to draw to an offscreen buffer (a GWorld), which you
  495. > conceptually divide into a number of nicely aligned rectangles. Keep track
  496. > of which rectangles are "dirty". (If you change any pixel in a rectangle,
  497. > the whole thing is dirty.) Then use CopyBits to copy the dirty rectangles
  498. > to the screen. Coalesce adjacent dirty rectangles when you can, to reduce
  499. > the number of calls. Make sure the source and destination have the same
  500. > ColorTable, so CopyBits can know that it doesn't have to translate color
  501. > indexes. 
  502.  
  503. This is a very good suggestion.
  504.  
  505. > If your game draws into a movable window that is smaller than the screen
  506. > (always a nice courtesy), make sure the window remains aligned to nice
  507. > boundaries. If the user drags the window, snap it to a nice boundary.
  508. > HyperCard does this, for example. This guarantees that CopyBits won't have
  509. > to shift the data while it moves it. Alternatively, make the GWorld a
  510. > little bigger than the window, so you can shift the window contents in the
  511. > GWorld to align them with the window contents on the screen.
  512.  
  513.  
  514. Okay, very good advice about CopyBits, but what about the situations where
  515. CopyBits is not fast enough. Direct to screen drawing can be much faster.
  516. For a sprite game (which is what I am writing) you generally know what
  517. sort of movement your sprites will have, and how best to handle them.
  518. Depending on your game, there are a huge number of optimisations you can
  519. make.
  520.  
  521. For instance, it is possible to erase a sprite while redrawing the next
  522. frame, all directly to the screen (i.e. no drawing into gworlds first) in
  523. a single step, and using only 3 68K assembly language instructions for 4
  524. pixels PROVIDED certain conditions are met. I do this and have noticed no
  525. flicker.
  526.  
  527. With the blitters I am using, I could (read CAN) do all my drawing in a
  528. single vbl interrupt on anything above a 25MHz 040. Since an 030 will not
  529. (quite) manage this, I prefer not to.
  530.  
  531.  
  532. What to avoid ? Writing outside of video ram. This may sound obvious, but
  533. make sure your routines do not slip outside vram. This will almost always
  534. cause a bus error (crash!!!). Also you will need to run in only one screen
  535. depth (most people go for 8-bit). You should ensure that the chosen
  536. graphics device supports this depth and is actually set to it.
  537. If you allow users access to the menu bar during your game loop, you will
  538. have to ensure that someone hasn't used color switch to change depth. Many
  539. games don't allow access to the menu bar (except when the game is paused),
  540. so you might not have this worry.
  541.  
  542. At the very least you should check after every resume event that the
  543. screen depth has not changed. If the screen depth has changed (or in fact
  544. is not suitable when the game starts) you should either just change it
  545. (some people won't like that), and then change back on a suspend event, or
  546. tell the user to change it/give them the option. How you handle this is
  547. really up to you.
  548.  
  549. Anyway, I hope this helps. I would say that you should think very
  550. carefully before drawing direct to the screen. You should try to use
  551. copybits in a more intellingent way (like only updating the areas you
  552. really need to). You should make sure all copying areas are longword
  553. aligned. You should make sure the source and destination are the same
  554. depth/same color table. If none of this helps you get the performance you
  555. need, you should then try direct to screen drawing for some of your
  556. 'safer' copies and make sure it helps (running a profiler will help you
  557. out here). No sense having all the headache of vram access if that isn't
  558. the bottleneck. If it helps, then you will probably want to change all
  559. your code to direct screen.
  560.  
  561. You will probably find you have a large number of blitters for each sprite
  562. size - no sense writing a too general routine. Personally I have a pointer
  563. to my blitter as part of a sprite's data structure. There are a number of
  564. occasions where I want to change the blitter. I have found this to be
  565. easiest.
  566.  
  567.  
  568. Don't ignore Ron's advice completely, but I would say it is a bit extreme.
  569. Just be careful.
  570.  
  571. And feel free to email me if you need help.
  572.  
  573. Mark
  574.  
  575. - ------------------------------------------------------------------
  576. Mark C Elliott                           elliott@mpi-muelheim.mpg.de
  577. Max-Planck-Institut                      voice: (+49) 208 306 2429
  578. Fuer Kohlenforschung
  579. Muelheim, Germany
  580. - ------------------------------------------------------------------
  581.  
  582. +++++++++++++++++++++++++++
  583.  
  584. >From miller@minerva.cis.yale.edu (Adam Miller)
  585. Date: 11 Dec 1995 18:48:23 GMT
  586. Organization: Yale University
  587.  
  588. In article <hnsngr-1012952259110001@ppp116-sf2.sirius.com>
  589. hnsngr@sirius.com (Ron Hunsinger) writes:
  590.  
  591. > On small areas, the speed of CopyBits *per pixel* may be low, but if he
  592. > isn't updating very many pixels it doesn't matter. The total time spent
  593. > updating the screen, whether with CopyBits or otherwise, should remain
  594. > small.
  595.  
  596. That can often be far from the case.  I wrote a game that typically had
  597. about thirty generally 32x32 sprites running around the screen at any
  598. given time.  CopyBits was slow, so I wrote a very simple blitter in C. 
  599. The result was a 3x speedup.  Copying the entire screen, not just the
  600. update regions, with CopyBits was about as fast as using CopyBits for
  601. the individual sprites.  The thing to remember is that video ram is
  602. really slow, so you don't want to write more than necessary.
  603.  
  604. Anyway, the solution for the poster is to write a blitter, but give the
  605. user the option to turn it off and use CopyBits.  That way you'll
  606. achieve full speed on the 99% at least of Macs that will work with a
  607. blitter, but you'll also retain compatibility.
  608.  
  609. adum
  610.  
  611. +++++++++++++++++++++++++++
  612.  
  613. >From "Andrew C. Plotkin" <erkyrath+@CMU.EDU>
  614. Date: Mon, 11 Dec 1995 17:05:59 -0500
  615. Organization: Carnegie Mellon, Pittsburgh, PA
  616.  
  617. elliott@mpi-muelheim.mpg.de (Mark Elliott) writes:
  618. > > No you don't. You can use CopyBits.
  619. > Oh come on Ron. Apple have published guidelines for direct-to-screen drawing.
  620. > For a game I am writing there is simply no way I could get acceptable
  621. > frame rates using copybits. Even drawing directly into vram was a push.
  622. > Now, a game which would have required a 68040 as minimum will run happily
  623. > on a 25 MHz 68030. This has to be a consideration.
  624.  
  625. And you have a "quickdraw-compatible" mode, right?  Which uses
  626. CopyBits? For people with that strange hardware configuration you
  627. *didn't* test?
  628.  
  629. --Z
  630.  
  631. "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the borogoves..."
  632.  
  633. +++++++++++++++++++++++++++
  634.  
  635. >From hnsngr@sirius.com (Ron Hunsinger)
  636. Date: Wed, 13 Dec 1995 08:09:41 -0800
  637. Organization: ErsteSoft
  638.  
  639. In article <elliott-1112951926270001@mcmds.mpi-muelheim.mpg.de>,
  640. elliott@mpi-muelheim.mpg.de (Mark Elliott) wrote:
  641.  
  642. > In article <hnsngr-1012950443410001@ppp017-sf2.sirius.com>,
  643. > hnsngr@sirius.com (Ron Hunsinger) wrote:
  644. > > In article <ericd-0612952016300001@slip13.nilenet.com>,
  645. > > ericd@ra.nilenet.com (Eric A. Drumbor) wrote:
  646. > > 
  647. > > >      I *must* copy directly to the screen.>
  648. > > 
  649. > > No you don't. You can use CopyBits.
  650. > Oh come on Ron. Apple have published guidelines for direct-to-screen drawing.
  651.  
  652. The only published guidelines I have seen from Apple is "don't do it".
  653.  
  654. > Direct to screen drawing is not dangerous. Yeah, I am sure that some
  655. > hardware configurations (eg. strange graphics accelerators) MIGHT cause
  656. > problems. However, after the initial teething troubles (which are
  657. > certainly not unique to vram access) I have had essentially NO crashes. I
  658. > have tested my game on a wide range of 68K and powerpc macs with a fair
  659. > selection of monitor sizes.
  660.  
  661. Change MIGHT to WILL.
  662.  
  663. Have you tested your games on the Macs that will be coming out 5 years from now?
  664.  
  665. > And updating them using a single copybits is moving far too many bytes.
  666. > Sure you could keep track of which pixels are modified. I assume you are
  667. > creating your screen in a gworld and then copying to the screen. If you
  668. > keep track of which pixels are modified (or Rects around them) then only
  669. > CopyBits the parts which you need to, this might help. However, by the
  670. > sound of things, these will be small areas - this is where CopyBits
  671. > performs at its worst.
  672.  
  673. That is exactly what I recommended. I also recommended making sure the
  674. rectangles are aligned to memory boundaries. It's when the rectangles are
  675. unaligned that CopyBits is really slow.
  676.  
  677. It isn't just the number of pixels. Sometimes, copying more pixels is
  678. actually faster than copying fewer.
  679.  
  680. > > >      What are the odds this puppy will crash?
  681. > > 
  682. > > 100%. Guaranteed. Sorry to sound so pessimistic, but some of us still have
  683. > > the battle scars from ignoring Apple's advice not to write directly to the
  684. > > screen. It's good advice. Heed it.
  685. > If programmed properly it is no more likely to crash than any other program.
  686. > As I said, Apple have published guidelines for direct-to-screen drawing
  687. > (an issue of Develop. Eric, mail me and I will try to help you out with
  688. > references/code). They recommend that you don't do it, but at least they
  689. > tell you the safe way to do it.
  690.  
  691. I think you're figuring the odds over too small a sample. If it works on a
  692. particular machine, it will always work on that machine. But there are
  693. machines where it won't work at all. For example:
  694.  
  695.   a) Any Macintosh running A/UX will protect the screen. Programs that
  696.      try to write to the screen under A/UX will crash.
  697.  
  698.   b) The combination of 24-bit addressing mode and NuBus video will prevent
  699.      writing to the screen, because the NuBus memory is out of reach of
  700.      24-bit addresses. CopyBits knows to call SwapMMUMode at the right time.
  701.      It's really hard for your code to do this in a portable way. It's even
  702.      harder to anticipate the problem -- kudos if you had it implemented
  703.      BEFORE the Mac II came out.
  704.  
  705. The fact that there are already two kinds of Macintosh that won't support
  706. direct access to the screen should be a hint that there will be others.
  707.  
  708. As for trusting Apple because they told us how to do something, think
  709. about how many other times they've told us "Don't do this, but if you do
  710. here's how".
  711.  
  712. They told us:
  713.  
  714.    Don't modify the fields of a GrafPort directly, because they may change,
  715.    but if you feel you must here's the layout. [CGrafPorts have a different
  716.    layout.]
  717.  
  718.    Don't manipulate memory manager structures, but if you must here's what
  719.    they look like. [Then along came 32-bit addressing, and all the MM 
  720.    structures changed, from the TZone record down to the link words before
  721.    each field, and even the bits within a master pointer.]
  722.  
  723.    Don't play sounds by putting the data directly into the sound buffers,
  724.    but if you must, here's how. [There aren't any sound buffers now.]
  725.  
  726.    Don't expect every machine to support page flipping, but here's how to
  727.    do it. [No machine in recent history has supported page flipping.]
  728.  
  729.    There will be a single screen, 512x342 pixels, 1 bit per pixel. But for
  730.    compatibility with future machines, it's safer to rely on screenBits.
  731.    [screenBits is a BitMap, even if your main screen is in color. 
  732.    screenBits.rowBytes is a lie, on the grounds that this little lie
  733.    breaks fewer programs than the truth would. And you know what happened
  734.    to screen sizes, screen depths, and even the number of screens.]
  735.  
  736.    There will be a single menu bar at the top of the screen. It will be
  737.    20 pixels high, and contain the names, in Chicago 12, of every menu.
  738.    Menus will not pop up from other places, like from within windows, and
  739.    most certainly not out of other menus. There won't be anything in the
  740.    menu bar except menu names. No icons (unless you count the Apple as an
  741.    icon, which it isn't). [Not a single word of the foregoing is still
  742.    true, although I'm sure Apple meant it all at the time.]
  743.  
  744. If you really think it's different this time, when Apple says "Don't write
  745. to the screen, but if you must here's how", go right ahead. I've learned
  746. that when they say "Don't do this, but if you must here's how," they mean
  747. "This may work now, but it's going to break, and probably sooner than you
  748. expect."
  749.  
  750. > I have disassembled many action games. In almost all cases, games which
  751. > are highly rated (eg. the Ambrosia games) use direct to screen drawing. I
  752. > have yet to see one of these games crash.
  753.  
  754. They will. Not on the machines that they are running on (obviously). But
  755. they won't run on the machines that will be on the market in five years.
  756. Nor on a Mac II, at least not at first.
  757.  
  758. > > >      How are these companies staying compatable with all the different
  759. > > > Macs and video configs? 
  760. > > 
  761. > > CopyBits will always be able to write to the screen, even when the day
  762. > > comes that you can't.
  763. > They are using GetBaseAddr to find the address of screen memory. They
  764. > check the device list to find a screen which supports the required depth
  765. > and has the required size. They check the pixMap to find the rowBytes
  766. > value. Then they make sure that there is no way their drawing will be
  767. > outside of the screen memory.
  768.  
  769. Getting the base address is nice. That's what we did on the early
  770. machines. We didn't call it GetBaseAddr, of course. We called it
  771. screenBits.baseAddress, and for all anyone knew at the time, that (and the
  772. rest of screenBits) was all you needed to know. Ask anybody. They'd tell
  773. you. That was how you did it, and it was perfectly safe.
  774.  
  775. Except for Apple, of course. Those wet blankets kept saying "Don't write
  776. to the screen. Your program will crash on future Macs." But hey, what did
  777. they know? And what's that you say about "device list", "pixMap", and all
  778. that? We didn't worry about things like that, because things like that
  779. hadn't been invented yet.
  780.  
  781. What things are you overlooking that haven't been invented yet?
  782.  
  783. > Sure this will prevent disaster, but it may also prevent acceptable
  784. performance.
  785.  
  786. When the new machines come out, and your program won't even run, that's
  787. REALLY unacceptable performance.
  788.  
  789. > I think I know what went wrong here. You unwrapped the loop. Yeah,
  790. > everyone says you should do this. It is usually faster. However if you
  791. > unwrap the loop to the extent that the loop is larger than the processors
  792. > cache, it will have to reload the code possibly several times per loop.
  793.  
  794. Cache on a 68000? I was very explicit that the test was run on a Plus,
  795. that it was optimized for a Plus, and that the results were only
  796. meaningful on the Plus. The Plus has a 68000, which does not have a cache.
  797. The more you unwind the loop, the better.
  798.  
  799. But you're correct about how traditional optimization techniques become
  800. counterproductive as the hardware changes. Even on a 68010, a simple
  801. MOVE.L (A0)+,(A1)+;DBRA D0,*-4 becomes unbeatable. The MOVE16 on the 68040
  802. may be better yet, but only a little and only if your RAM supports burst
  803. read/write.
  804.  
  805. The point is that the ROM on your machine knows what processor you have
  806. AND it knows any other idiosynchrocies that your configuration may have.
  807. Your code cannot afford to have separate code optimized for each possible
  808. machine, so it has to compromise. The ROM doesn't.
  809.  
  810. > Also, copying large areas is where CopyBits wins. Try copying a 24 x 24
  811. > sprite using a custom blitter or using copybits. If you can get CopyBits
  812. > to perform at half the speed of your blitter you should write a better
  813. > blitter.
  814.  
  815. By the time I call CopyBits, all the tricky parts will be done. That is, I
  816. would write a custom blitter that does all the necessary shifting,
  817. masking, erasing, maybe color translation if that's called for in the
  818. game. Then I'd use CopyBits just to get the data to the screen. In a
  819. sense, this makes the CopyBits time pure overhead. On the other hand,
  820. CopyBits will be called only with the easiest parameters. Also, the
  821. separation into two passes lets me process (possibly overlapping) sprites
  822. back to front in the first pass, and non-overlapping rectangles top to
  823. bottom in the second pass, so I don't need to worry about tearing or
  824. flicker. There won't be any, even if I don't synch up to VBL, and even on
  825. slow machines. The second pass, even if done with CopyBits, is a lot
  826. simpler than the first pass. If it adds even 50% to your drawing time,
  827. you're not drawing a very complex image.
  828.  
  829. > Okay, very good advice about CopyBits, but what about the situations where
  830. > CopyBits is not fast enough. Direct to screen drawing can be much faster.
  831. > For a sprite game (which is what I am writing) you generally know what
  832. > sort of movement your sprites will have, and how best to handle them.
  833. > Depending on your game, there are a huge number of optimisations you can
  834. > make.
  835.  
  836. I accept that direct-to-screen may be a little faster, but I don't believe
  837. that it's going to be a lot faster.
  838.  
  839. > You will probably find you have a large number of blitters for each sprite
  840. > size - no sense writing a too general routine. Personally I have a pointer
  841. > to my blitter as part of a sprite's data structure. There are a number of
  842. > occasions where I want to change the blitter. I have found this to be
  843. > easiest.
  844.  
  845. I like that. That's a good idea.
  846.  
  847. > Don't ignore Ron's advice completely, but I would say it is a bit extreme.
  848. > Just be careful.
  849.  
  850. Ok, I'll leave it at that. We've both stated our opinions, and he can decide.
  851.  
  852. -Ron Hunsinger
  853.  
  854. +++++++++++++++++++++++++++
  855.  
  856. >From dowdy@apple.com (Tom Dowdy)
  857. Date: Wed, 13 Dec 1995 20:40:21 GMT
  858. Organization: Apple Computer, Inc.
  859.  
  860. In article <jregier-1312951125090001@jregier-mac.qualcomm.com>,
  861. jregier@qualcomm.com (Jason Regier) wrote:
  862. > > > Direct to screen drawing is not dangerous. Yeah, I am sure that some
  863. > > > hardware configurations (eg. strange graphics accelerators) MIGHT cause
  864. > > > problems.
  865. > > Change MIGHT to WILL.
  866. > > 
  867. > Oh come on.  Many games have used, and will use, direct-to-screen blitting
  868. > to get the performance they want/need.  To wit: Spaceway 2000, any
  869. > Ambrosia Software game, Dark Forces (according to notes for their 1.2
  870. > updater), Space Madness, etc.  These games aren't getting flamed right and
  871. > left for their incompatibilities with existing machines.  If they were
  872. > incompatible with a majority of the machines in the market, they wouldn't
  873. > sell at all.  But as you suggest, as a precaution, some of them wisely
  874. > allow a CopyBits-only mode just in case you're having problems with the
  875. > direct-to-screen drawing.
  876. > > Have you tested your games on the Macs that will be coming out 5 years
  877. > from now?
  878. > As callous as this might sound, I would venture to say that those
  879. > commercial products using direct-to-screen writing (especially those not
  880. > supporting a CopyBits mode) aren't totally worried about working 5 years
  881. > from now.  5 years from now, their game will no longer be cutting edge,
  882. > their profit margins will have fallen considerably and they most likely
  883. > won't be on store shelves anymore.  It's a just a chance developers are
  884. > willing to take in order to release a cutting-edge game now and make a
  885. > profit in the current market.
  886.  
  887. As long as you follow the recommendations (those in _develop_ are
  888. a pretty good summary), and in particular are careful to check that
  889. your window really is in the front, is not obscured, be sure
  890. to call ShieldCursor() before drawing, and have non-buggy blit loops,
  891. you'll probably be safe drawing to the screen moving forward to the
  892. future.
  893.  
  894. There is no way to promise 100% that everyone's (or anyone's) direct
  895. to screen drawing will work forever.  However, within the above
  896. mentioned guidelines, it is likely that your game will be OK
  897. at least in the short->medium term.
  898.  
  899. -- 
  900.  Tom Dowdy                  Internet: dowdy@apple.COM
  901.  Apple Computer MS:302-3KS  UUCP: {sun,voder,amdahl,decwrl}!apple!dowdy
  902.  1 Infinite Loop            AppleLink: DOWDY1
  903.  Cupertino, CA 95014       
  904.  "The 'Ooh-Ah' Bird is so called because it lays square eggs."
  905.  
  906. +++++++++++++++++++++++++++
  907.  
  908. >From jregier@qualcomm.com (Jason Regier)
  909. Date: Wed, 13 Dec 1995 11:25:09 -0800
  910. Organization: Qualcomm, Inc.
  911.  
  912. In article <hnsngr-1312950809410001@ppp037-sf2.sirius.com>,
  913. hnsngr@sirius.com (Ron Hunsinger) wrote:
  914. > The only published guidelines I have seen from Apple is "don't do it".
  915. Then check out Develop magazine, which is available online from Apple.  I
  916. think it might be in issue 9, and the article is called something like
  917. "Safely Drawing Directly to the Screen".  It tells you all the caveats,
  918. and provides very readable (but not optimal) sample code for
  919. direct-to-screen blitting.
  920.  
  921. > > Direct to screen drawing is not dangerous. Yeah, I am sure that some
  922. > > hardware configurations (eg. strange graphics accelerators) MIGHT cause
  923. > > problems.
  924. > Change MIGHT to WILL.
  925. Oh come on.  Many games have used, and will use, direct-to-screen blitting
  926. to get the performance they want/need.  To wit: Spaceway 2000, any
  927. Ambrosia Software game, Dark Forces (according to notes for their 1.2
  928. updater), Space Madness, etc.  These games aren't getting flamed right and
  929. left for their incompatibilities with existing machines.  If they were
  930. incompatible with a majority of the machines in the market, they wouldn't
  931. sell at all.  But as you suggest, as a precaution, some of them wisely
  932. allow a CopyBits-only mode just in case you're having problems with the
  933. direct-to-screen drawing.
  934.  
  935. > Have you tested your games on the Macs that will be coming out 5 years
  936. from now?
  937. As callous as this might sound, I would venture to say that those
  938. commercial products using direct-to-screen writing (especially those not
  939. supporting a CopyBits mode) aren't totally worried about working 5 years
  940. from now.  5 years from now, their game will no longer be cutting edge,
  941. their profit margins will have fallen considerably and they most likely
  942. won't be on store shelves anymore.  It's a just a chance developers are
  943. willing to take in order to release a cutting-edge game now and make a
  944. profit in the current market.
  945.  
  946. > It isn't just the number of pixels. Sometimes, copying more pixels is
  947. > actually faster than copying fewer.
  948. If you've read the Develop article or Tricks of the Mac Game Programming
  949. Gurus, you'll remember that CopyBits does extremely poorly when copying
  950. tiny sprites.  If you're copying lots of tiny sprites to the screen, and
  951. you can't beat the overhead incurred by CopyBits, you're probably doing
  952. something wrong.
  953.  
  954. > The fact that there are already two kinds of Macintosh that won't support
  955. > direct access to the screen should be a hint that there will be others.
  956. >
  957. This is a good point.  It doesn't mean you shouldn't allow this option in
  958. your game, can't guarantee its success either.
  959.  
  960. As for things that Apple told you not to do, I wanted to point out a few things:
  961. >    Don't play sounds by putting the data directly into the sound buffers,
  962. >    but if you must, here's how. [There aren't any sound buffers now.]
  963. SoundManager supports a bufferCmd, which is used as a parameter to
  964. SoundDoCommand() or SoundDoImmediate().  If you wish, you can play sounds
  965. directly this way instead of using SoundPlay.
  966.  
  967. >    Don't expect every machine to support page flipping, but here's how to
  968. >    do it. [No machine in recent history has supported page flipping.]
  969. Although I've never done it, some Macs actually had/have hardware support
  970. for page flipping-- I believe it was called the Valkyrie chip.  I think
  971. Juri Munkki might have supported this in Arashi, but he'll have to confirm
  972. this.
  973.  
  974. The fact is, things change.  Apple's documentation isn't perfect, and it's
  975. always changing.  You can't rely on old news, even if it's in print, to be
  976. the current gospel.  Apple wrote years ago in Develop that
  977. direct-to-screen drawing wasn't recommended and may be incompatible with
  978. future software and hardware, but that it's sometimes necessary to get the
  979. most out of high-powered programs, like games and graphics demos.  That
  980. being said, you roll the dice, you take your chances.  And as I'm sure
  981. many software developers can say, sometimes the payoffs for taking such
  982. risks are big.
  983.  
  984. Jason
  985.  
  986. -- 
  987. Jason Regier
  988. GlobalStar Software Engineer
  989. QUALCOMM, Inc.
  990. (619) 658-4752
  991. jregier@qualcomm.com
  992.  
  993. +++++++++++++++++++++++++++
  994.  
  995. >From jmunkki@beta.hut.fi (Juri Munkki)
  996. Date: 14 Dec 1995 04:37:34 GMT
  997. Organization: Helsinki University of Technology
  998.  
  999. In article <hnsngr-1312950809410001@ppp037-sf2.sirius.com> hnsngr@sirius.com (Ron Hunsinger) writes:
  1000. >The only published guidelines I have seen from Apple is "don't do it".
  1001.  
  1002. Then it's probably best if you don't do it and let us (who have seen
  1003. the guidelines) do it.
  1004.  
  1005. >Change MIGHT to WILL.
  1006. >Have you tested your games on the Macs that will be coming out 5 years from now?
  1007.  
  1008. I see screen buffer access changes the least of the reasons why games
  1009. software will break in five years.
  1010.  
  1011. Let's think of this: the Sound Driver is dead, gone, kaput. Does that mean
  1012. that back before the Sound Manager existed, we should have avoided using
  1013. sound (especially double buffered sampled sound, since Apple said the
  1014. support was going away) just because we knew it wasn't going to work in
  1015. the distant future. I don't think so...stuff like that is necessary when
  1016. you are writing games. Some day it will not work, but if you stay up to
  1017. date, you can release a free update of your program before anyone has
  1018. trouble with your code.
  1019.  
  1020. >  a) Any Macintosh running A/UX will protect the screen. Programs that
  1021. >     try to write to the screen under A/UX will crash.
  1022.  
  1023. Incorrect. Last time I checked, Arashi was still working fine on A/UX.
  1024. That was a while ago. A more recent example is a screen saver that I
  1025. wrote last year: it's used with DarkSide on an A/UX workgroup server.
  1026. Hasn't crashed so far and it doesn't use QuickDraw for drawing.
  1027.  
  1028. >  b) The combination of 24-bit addressing mode and NuBus video will prevent
  1029. >     writing to the screen, because the NuBus memory is out of reach of
  1030. >     24-bit addresses. CopyBits knows to call SwapMMUMode at the right time.
  1031. >     It's really hard for your code to do this in a portable way. It's even
  1032. >     harder to anticipate the problem -- kudos if you had it implemented
  1033. >     BEFORE the Mac II came out.
  1034.  
  1035. It breaks when you are not following the rules. There are two
  1036. approaches to SwapMMUMode: call it always (it doesn't hurt, since it is
  1037. documented to be a no-op on machines with 32-bit addressing) or check
  1038. the flag bit of the pixel map you are writing to.
  1039.  
  1040. Almost everyone missed this one back in the days of the Mac II. Actually
  1041. it seems to me that quite a few programmers learned about it from me. I
  1042. remember telling Ingemar Ragnemalm and John Calhoun. It's still the #1
  1043. mistake that games programmers make: look at Wolfenstein 3D (at least
  1044. the first version...I don't know if they fixed it).
  1045.  
  1046. >The fact that there are already two kinds of Macintosh that won't support
  1047. >direct access to the screen should be a hint that there will be others.
  1048.  
  1049. So, can anyone come up with a real case where it really isn't possible
  1050. to draw directly to the screen on a Mac? The closest I can think of is
  1051. Pivot software and Stepping Out, since you are actually fooled into
  1052. drawing into their buffers. It still copies back onto the screen later,
  1053. if you called ShieldCursor/ShowCursor.
  1054.  
  1055.  
  1056. >   Don't play sounds by putting the data directly into the sound buffers,
  1057. >   but if you must, here's how. [There aren't any sound buffers now.]
  1058.  
  1059. Well, as I said above, what they told us to do back then no longer works,
  1060. but that was expected.
  1061.  
  1062. >They will. Not on the machines that they are running on (obviously). But
  1063. >they won't run on the machines that will be on the market in five years.
  1064. >Nor on a Mac II, at least not at first.
  1065.  
  1066. Would you like to bet on it?
  1067.  
  1068. >I accept that direct-to-screen may be a little faster, but I don't believe
  1069. >that it's going to be a lot faster.
  1070.  
  1071. I guess how fast you can go depends on the programmer. A bad programmer can
  1072. do a lot worse than CopyBits. A good programmer will be able to do a lot better.
  1073.  
  1074. Even without dynamic sprite compiling, the 8-bit masked blitter that was
  1075. co-written on comp.sys.mac.programmer a few years (for Space Madness) ran
  1076. 7 times faster than CopyBits on a Quadra 700. That kind of speed difference
  1077. means that without the direct access, the game couldn't have been done.
  1078.  
  1079. -- 
  1080. Juri Munkki jmunkki@iki.fi              Life is easy when polygons are cheap.
  1081. http://www.iki.fi/~jmunkki                 Windsurfing: Faster than the wind.
  1082.  
  1083. +++++++++++++++++++++++++++
  1084.  
  1085. >From jmunkki@beta.hut.fi (Juri Munkki)
  1086. Date: 14 Dec 1995 05:02:10 GMT
  1087. Organization: Helsinki University of Technology
  1088.  
  1089. In article <jregier-1312951125090001@jregier-mac.qualcomm.com> jregier@qualcomm.com (Jason Regier) writes:
  1090. >>    Don't expect every machine to support page flipping, but here's how to
  1091. >>    do it. [No machine in recent history has supported page flipping.]
  1092. >> 
  1093. >Although I've never done it, some Macs actually had/have hardware support
  1094. >for page flipping-- I believe it was called the Valkyrie chip.  I think
  1095. >Juri Munkki might have supported this in Arashi, but he'll have to confirm
  1096. >this.
  1097.  
  1098. Since you asked...
  1099.  
  1100. No, I didn't use actual page flipping to do page flipping. I wanted to have
  1101. some static background graphics (the grid and the spikes) single-buffered
  1102. and then I needed some double-buffered graphics over those. So, on an 8 bit
  1103. display card, I took two bits to make two 1-bit bitplanes and 6 bits to
  1104. get one double-buffered 3 bit frame buffer.
  1105.  
  1106. The color tables can be arranged so that some bits and/or color combinations
  1107. become effectively transparent. There are 10 colors on screen in Arashi:
  1108. the background color (black), the grid color, spikes color and seven colors
  1109. for double-buffered moving shapes (one color was used for transparent).
  1110.  
  1111. It's not a useful method for doing sprites or any kind of filled graphics,
  1112. because you are not actually dealing with real bitplaned graphics (like on
  1113. the Amiga...not that I would have ever programmed the Amiga). So the
  1114. drawing routine has to touch only a few bits at a time in one pixel at
  1115. a time (well, you could get 4 pixels if you used a combination of and
  1116. and OR). Erasing was done by drawing with the transparent color.
  1117.  
  1118. The buffer switch with Arashi happens by changing the color table. Back
  1119. then it was the best way to implement Arashi. Machines are now faster and
  1120. can do all of it in software, so if I was writing the same game again
  1121. today, I might do it differently (mostly to get more colors on screen).
  1122.  
  1123. The real page flipping interface is (was?) described in Designing Cards
  1124. and Drivers for the Macintosh Family Computers. It's not supported very
  1125. widely: I haven't checked recently. Back when I discovered it, I was using
  1126. a Mac II with an 8 bit Toby frame buffer (the original Mac II video card).
  1127. You could (and still can) have multiple buffers on the Toby.
  1128.  
  1129. I was interested in it, because I was doing software for 3D LC-shutter
  1130. glasses and they need two buffers for static images and four buffers
  1131. for animation. I never used it though, because it only worked in a few
  1132. configurations. Oids seems to use it when it is available. It does make
  1133. debugging tough, because you might be showing a screen that the window
  1134. manager knows absolutely nothing about (no cursor either).
  1135.  
  1136. -- 
  1137. Juri Munkki jmunkki@iki.fi              Life is easy when polygons are cheap.
  1138. http://www.iki.fi/~jmunkki                 Windsurfing: Faster than the wind.
  1139.  
  1140. +++++++++++++++++++++++++++
  1141.  
  1142. >From bwade@qualia.com (Bretton Wade)
  1143. Date: Thu, 14 Dec 1995 01:14:55 -0500
  1144. Organization: qualia, inc.
  1145.  
  1146. Two little details here...
  1147.  
  1148. The PRIMARY reason Apple suggests using CopyBits for image to screen
  1149. copying is that it respects all of Apple's internal clipping structures,
  1150. and so will correctly update the screen even if your target window is
  1151. partially covered by other windows. In game programming, you most likely
  1152. have opened a port over the entire screen, and are not at all concerned
  1153. about this possibility.
  1154.  
  1155. I'd be surprised if Apple write protected the screen any time soon. I
  1156. think this because Apple is trying very hard to get game developers to
  1157. make games on the mac (sells machines, you know), and the recent push in
  1158. the Win95 world to put out a package that gives direct screen access. Game
  1159. developers want screen access.
  1160.  
  1161. Even if Apple does do something like this, I'll bet the ShieldCursor call
  1162. will correctly unprotect the region specified in the rectangle. Note that
  1163. ShieldCursor is supposedly called just before every operation which writes
  1164. directly to the screen in all of Apple's code. That includes CopyBits. I
  1165. understand that Radius uses this fact to its advantage in their
  1166. accelerators by informing the hardware of an impending write. It's another
  1167. reason to call Shield Cursor whenever you plan to write directly to the
  1168. screen.
  1169.  
  1170. -- 
  1171. bwade@qualia.com
  1172. http://www.qualia.com/
  1173.  
  1174. +++++++++++++++++++++++++++
  1175.  
  1176. >From poschs@MCS.COM (Scott Posch)
  1177. Date: 14 Dec 1995 09:37:41 -0600
  1178. Organization: /usr/lib/news/organi[sz]ation
  1179.  
  1180. As a relatively new MAC game programmer, I have been interested in this
  1181. discussion. But, I have a question.
  1182.  
  1183. In the "Power PC Optimization" chapter of "Tricks of the MAC Game Programming
  1184. Gurus", the author writes a blitter that moves doublewords from a buffer
  1185. to an address that he got from a structure. It's either the qd structure, 
  1186. or a window structure. (Can't remember)
  1187.  
  1188. Is this considered writing directly to the screen, or not?
  1189.  
  1190. Thanks,
  1191. Scott Posch
  1192.  
  1193.  
  1194.  
  1195. +++++++++++++++++++++++++++
  1196.  
  1197. >From ericd@ra.nilenet.com (Eric A. Drumbor)
  1198. Date: Sun, 10 Dec 1995 10:05:25 -0700
  1199. Organization: BW Software
  1200.  
  1201. In article <hnsngr-1012950443410001@ppp017-sf2.sirius.com>,
  1202. hnsngr@sirius.com (Ron Hunsinger) wrote:
  1203.  
  1204. > >      I *must* copy directly to the screen.>
  1205. > No you don't. You can use CopyBits.
  1206.  
  1207.      Not if I want to give the opportunity for a good frame rate to a very
  1208. low end machine.  It's complete overkill to use CopyBits for a lone pixel,
  1209. or to copy a sizable Rect for two changed pixels.  Let me clarify
  1210. something, this is going to be an option, not something that the end user
  1211. doesn't have control over, as it should be.  So, yes, I do need to write
  1212. directly to the screen for this method to be effective.
  1213.  
  1214. > > My frame updates/changes are
  1215. > > too small and too spread out to use CopyBits.
  1216. > If that's true, then updating the screen is not your bottleneck. "Small
  1217. > and spread out" means you aren't updating very many pixels.
  1218.  
  1219.     ...and your point is?  Small and spread out wasn't meant to imply only
  1220. a few changed pixels (my fault, won't happen again, sorry sorry).  It's
  1221. implying that updated areas of the screen are more or less small, spread
  1222. out patches, something that (must I say this again?) CopyBits becomes very
  1223. inefficient at when it's being used several hundred times in a frame.
  1224.  
  1225. > >      What are the odds this puppy will crash?
  1226. > 100%. Guaranteed. Sorry to sound so pessimistic, but some of us still have
  1227. > the battle scars from ignoring Apple's advice not to write directly to the
  1228. > screen. It's good advice. Heed it.
  1229. > Video memory will not always be memory mapped. Even if it is, it will not
  1230. > always be writable. As memory protection improves (as it must if Apple
  1231. > wants to make these machines more robust), VRAM won't always be in your
  1232. > process' address space, even if it remains in the machine's address space.
  1233.  
  1234.      This is what I wanted to hear (an answer to my question).  Thank you,
  1235. Ron, at least for this part.  The rest, well....
  1236.  
  1237. > How are you "seeing" games use this method. Did you disassemble the code,
  1238. > or trace it? If you had, you would *know* whether they were using
  1239. > CopyBits, without having to make assumptions.
  1240.  
  1241.      Since my first post, yes, I have traced (ugh) through some code.  I
  1242. was going on the claims a few people made at the university, but the
  1243. claims were true enough.  Go figure...
  1244.  
  1245. > >      How are these companies staying compatable with all the different
  1246. > > Macs and video configs? 
  1247. > CopyBits will always be able to write to the screen, even when the day
  1248. > comes that you can't.
  1249.  
  1250.      I know this, my original question wasn't about CopyBits, it was about
  1251. using an alternate method.  Of course, what you've said here doesn't
  1252. actually answer this question either, does it?
  1253.  
  1254. > > Is there some kind of magic function to prevent
  1255. > > disaster when trying to write to the video memory of a video card?
  1256. > Yes. It's called CopyBits.
  1257.  
  1258.      Exactly what is the problem here?  I'm trying to determine whether or
  1259. not it's viable to use a method I've described above, an *alternative* to
  1260. CopyBits, that's all.  Why these little one-liner jabs?  Totally uncalled
  1261. for and pathetic.
  1262.  
  1263. [snip]
  1264.  
  1265. > In fact, I once wrote a benchmark where I put CopyBits head-to-head
  1266. > against a handcrafted assembler routine to copy a full screen image
  1267. > directly to the screen of a Mac Plus. The assembler routine used a
  1268. > sequence of 32 MOVE.L (A0)+,(A1)+ instructions to copy each pair of
  1269. > scanlines (32 x 32 = 1024 = 2 * 512), in a loop that repeated 171 times.
  1270. > You can't get much tighter than that. But you know what? CopyBits beat it!
  1271. > It turns out that, on a Mac Plus at least, CopyBits really is unbeatable.
  1272. > Now I'm not claiming on the basis of that experiment that CopyBits is
  1273. > always unbeatable. Far from it. This is a trick result. It turns out that
  1274. > on a Plus, ROM is faster than RAM because it doesn't have to compete with
  1275. > video refresh. Consequently, code in ROM (like CopyBits) has a slight edge
  1276. > (about 20%) over code in RAM (like my assembler routine). The Plus also
  1277. > does not support Color QuickDraw, so the CopyBits on that machine doesn't
  1278. > have to mess with Palettes and ColorTables and all that sort of stuff.
  1279.  
  1280.      I'm not surprised it beat your routine, but your case simply doesn't
  1281. apply to my situation.  I've written my own routine (a full screen
  1282. blitter) and found it to be only slightly faster (if at all) when copying
  1283. a large Rect, I wasn't surprised in the least.  Another good example of
  1284. this is my polygon rasterizing routine (which draws directly into a
  1285. GWorld).  When drawing smaller (150 x 150 square for instance) polygons,
  1286. I'm getting over three times the speed that FillPoly would produce.  On
  1287. the other side, my routine is only about 5% faster than FillPoly when
  1288. filling an 832 x 624 screen.  In this case, the overhead of FillPoly is
  1289. still hurting the speed, but the actual rasterizing is now the major
  1290. bottleneck, and both routines share this bottleneck.  Of course, most of
  1291. the polygons I draw aren't filling the screen, and the fact that my
  1292. routine cuts out the overhead that is involved when filling a polygon in
  1293. QuickDraw means that my frame rate will at least double on average, if not
  1294. triple.  This is where the overhead comes into play, and the same goes for
  1295. CopyBits, when COPYING SEVERAL SMALL REGIONS.  Ahem...
  1296.  
  1297.      If I was copying a large area (or even < 12 smaller areas, like a
  1298. 32x32 square) there would be no two ways about it, CopyBits would be used
  1299. (and IS an option in this game).  However, the overhead of making a few
  1300. hundred calls to it per frame is what is killing the speed.  I don't see
  1301. why this point has eluded you through my previous message.  It's NOT the
  1302. actual copying speed of CopyBits (I shouldn't need to point this out!),
  1303. it's the overhead involved in calling it in the first place, along with
  1304. the checks for ctSeed, etc.  I've been a firm believer in CopyBits for all
  1305. my offscreen->screen blits, and I've even taken a similar stance to your
  1306. own, but this situation is different.  This time I'd like to find a happy
  1307. alternative, besides providing CopyBits as a solution (again, the user has
  1308. a choice).  I want the highest frame rate possible while keeping the
  1309. system stable, period.
  1310.  
  1311. > But I do want you to notice two key points, that are relevant beyond the
  1312. > Mac Plus:
  1313. > a) Sure, CopyBits had a 20% advantage in code access, but it had no advantage
  1314. >    in data accesses, it is much more general-purpose, yet despite all that it 
  1315. >    still beat my code by several percent. It did not fritter away its 
  1316. >    advantage through inefficiency.
  1317. > b) CopyBits, being in ROM, can be tailored specifically for the machine it's
  1318. >    running on. It will run on a 68000, it will use 68020 instructions on an
  1319. >    '020, it runs native on a PowerMac. Because each ROM is specific to the
  1320. >    machine it's installed in, ROM routines like CopyBits can safely do
  1321. >    optimizations that you don't dare attempt, unless you're willing to ship
  1322. >    your product with a dozen hand-tailored routines, each optimized for a
  1323. >    different machine, including machines that haven't even been designed yet.
  1324. >    Quite an undertaking.
  1325. > Apple is fully aware of the importance of CopyBits. You can be sure that
  1326. > on any machine they write the ROM for, CopyBits and BlockMove will be
  1327. > optimized for that machine to within an inch of their lives. 
  1328. > You can help, though. When you call CopyBits, make sure the rectangles are
  1329. > aligned to nice machine boundaries. In B/W, this means you widen the
  1330. > rectangles if necessary so the left and right edges are longword aligned.
  1331. > Even though this means you'll be copying more pixels, it'll actually be
  1332. > faster because CopyBits won't have to do any masking. On an '040, give
  1333. > CopyBits the opportunity to use a MOVE16 instruction. On a PowerMac, align
  1334. > the rectangle boundaries to double-words, matching the width of the data
  1335. > bus. (You can ignore cache row boundaries, since video is never cached.
  1336. > Caching video would slow the machine to a crawl.)
  1337. > Your best bet is to draw to an offscreen buffer (a GWorld), which you
  1338. > conceptually divide into a number of nicely aligned rectangles. Keep track
  1339. > of which rectangles are "dirty". (If you change any pixel in a rectangle,
  1340. > the whole thing is dirty.) Then use CopyBits to copy the dirty rectangles
  1341. > to the screen. Coalesce adjacent dirty rectangles when you can, to reduce
  1342. > the number of calls. Make sure the source and destination have the same
  1343. > ColorTable, so CopyBits can know that it doesn't have to translate color
  1344. > indexes. 
  1345. > If your game draws into a movable window that is smaller than the screen
  1346. > (always a nice courtesy), make sure the window remains aligned to nice
  1347. > boundaries. If the user drags the window, snap it to a nice boundary.
  1348. > HyperCard does this, for example. This guarantees that CopyBits won't have
  1349. > to shift the data while it moves it. Alternatively, make the GWorld a
  1350. > little bigger than the window, so you can shift the window contents in the
  1351. > GWorld to align them with the window contents on the screen.
  1352.  
  1353.      I decided to leave your advice in case someone missed your post. 
  1354. It's the standard, good advice on CopyBits, and it helped me a year ago
  1355. when I was getting very low frame rates.
  1356.  
  1357.      I'm not trying to make an enemy of you Ron, but you're way out in
  1358. left field on this one.  I'm only trying to establish whether or not
  1359. there's a way to safely access VRAM.  Would it have been so difficult to
  1360. answer that particular question, and then mention the good reasons not to
  1361. try this?  Apparently so.  
  1362.  
  1363.      Writing to VRAM isn't illegal, and it certainly isn't immoral.  So
  1364. there's no reason for that boo-hoo crap up there.  This is a discussion
  1365. group, not an incessant pouting group.  You're only wasting your own time
  1366. (and my time for pointing this out to you) by putting in those remarks,
  1367. and not even understanding my original post from the start.  If it works
  1368. (IF), then it should be used, because it gives users on lower end Macs a
  1369. chance to play something (it may mean the difference between playability
  1370. and non-playability on low end Macs, why cast them aside when I don't need
  1371. to?).  If it works (IF again), it should be an option if (IF yet again) it
  1372. has the possibility of causing problems and/or crashing the machine.  In
  1373. the case of it causing problems, the user only needs to click a checkbox
  1374. in a prefs window to tell the app to use CopyBits, at least that's how it
  1375. should be.  Clean and simple...
  1376.  
  1377.      Your suggestions (out of place) are good.  The dirty rectangle method
  1378. is a very good idea, and I used it (and still do) previous to my original
  1379. post.  It's only *so* good though, isn't it?  I definitely write directly
  1380. in my GWorld memory, it cuts out quite a bit of (oop, there's that word
  1381. again) overhead.  BTW, you failed to mention keepLocal when allocating a
  1382. GWorld, since it could go on a video card's own memory and cause problems
  1383. if the app attempts to directly access it (and has to some people in the
  1384. past, but only on a few cards).  Don't worry Ron, I won't tell anyone..
  1385. ;-)
  1386.  
  1387.      My frame rate jumped from 32 fps up to 48 fps (on average, although
  1388. sometimes it was around 53 fps) on a 6100/60 at 832 x 624, by using this
  1389. method.  The idea here Ron, whether you wish to acknowledge it or not, is
  1390. to provide the best possible speed for the user without crashing the
  1391. machine.  That means sometimes rules like not writing directly to VRAM can
  1392. be broken, when it works and works better/faster and only if it works at
  1393. all.
  1394.  
  1395.      BTW, thanks goes out to everyone who did take the time to respond
  1396. (and actually answer my question).  I'll post a summary (or maybe this is
  1397. better as FAQ material) of the information I've received.  I really
  1398. appreciate your replies!
  1399.  
  1400.      Let's wrap this up.  I feel (and some others have acknowledged this,
  1401. but NOT RON!! I make no claims as to what Ron's opinion is on anything!)
  1402. that writing directly to video ram works, but isn't guranteed to work on
  1403. all machines, or *any* future Macs or video cards.  When correctly using
  1404. the ability to draw directly to video, higher frame rates can be achieved
  1405. if an only if the method doesn't crash the machine...in that case, the
  1406. method doesn't work, which basically means you're getting 0 (zero) frames
  1407. per second :-)  This method should only be used as an option that can be
  1408. set by the user.  This allows the user to play the game even if the BAAAD
  1409. wittle VRAM blitter is mean and nasty, and doesn't share the
  1410. blocks...especially the blue ones.
  1411.  
  1412.      Please tune in next time when Bruce discovers he needs a new liver
  1413. because of his long term drinking problems, Michael finds out he brought
  1414. back more than his luggage from his tour of the islands in the South
  1415. Pacific, Jim loves Lisa, but Lisa loves Sarah, and Ron Hunsinger will
  1416. undoubtedly tell me how clueless and rude I am.  Thanks and please tune in
  1417. again....
  1418.  
  1419. -- 
  1420. "Once in a while, a notty little boy loses it and comes after Santa"
  1421. Eric A. Drumbor      
  1422. ericd@ra.nilenet.com                 <http://www.nilenet.com/~ericd/>
  1423. BW Software
  1424.  
  1425. +++++++++++++++++++++++++++
  1426.  
  1427. >From elliott@mpi-muelheim.mpg.de (Mark Elliott)
  1428. Date: 15 Dec 1995 11:54:00 GMT
  1429. Organization: Max-Planck-Institut f. Kohlenforsch. Muelheim
  1430.  
  1431. In article <bwade-1412950114550001@ppp.qualia.com>, bwade@qualia.com
  1432. (Bretton Wade) wrote:
  1433.  
  1434. (snip)
  1435.  
  1436. > I'd be surprised if Apple write protected the screen any time soon. I
  1437. > think this because Apple is trying very hard to get game developers to
  1438. > make games on the mac (sells machines, you know), and the recent push in
  1439. > the Win95 world to put out a package that gives direct screen access. Game
  1440. > developers want screen access.
  1441.  
  1442. Supposing they do. I was thinking how I would fix my own game to take care
  1443. of this. I came up with 2 solutions.
  1444.  
  1445. 1. Use CopyBits for everything. This would basically involve a total
  1446. rewrite, since everything I have is optimised around the blitters. All my
  1447. sprite handling routines and sprite movement patterns are intended with my
  1448. blitters in mind.
  1449.  
  1450. 2. Carry on as I am, but instead of drawing directly to the screen, Set up
  1451. another GWorld, and draw 'directly' to this. Then after all the drawing is
  1452. done, CopyBits this entire GWorld to the screen.
  1453.  
  1454. It sounds like (2) loses all the advantages of direct screen access (i.e.
  1455. speed), but on reflection it isn't so bad. After all, it's only on 68030
  1456. machines that I really need those extra few fps. Any hypothetical machines
  1457. which might not allow direct screen access will be based on PowerPC chips,
  1458. and so will not have any problems (speedwise) with one full-screen
  1459. CopyBits per frame.
  1460.  
  1461. So, does anyone (Ron ???) want to tell me why this would not work? If I
  1462. know now, I can start thinking about other ways to get around this
  1463. possible (although IMO unlikely) problem.
  1464.  
  1465.  
  1466. (snip)
  1467.  
  1468. thanks
  1469.  
  1470. Mark
  1471.  
  1472. - ------------------------------------------------------------------
  1473. Mark C Elliott                           elliott@mpi-muelheim.mpg.de
  1474. Max-Planck-Institut                      voice: (+49) 208 306 2429
  1475. Fuer Kohlenforschung
  1476. Muelheim, Germany
  1477. - ------------------------------------------------------------------
  1478.  
  1479. +++++++++++++++++++++++++++
  1480.  
  1481. >From elliott@mpi-muelheim.mpg.de (Mark Elliott)
  1482. Date: 15 Dec 1995 11:48:27 GMT
  1483. Organization: Max-Planck-Institut f. Kohlenforsch. Muelheim
  1484.  
  1485. In article <bwade-1412950114550001@ppp.qualia.com>, bwade@qualia.com
  1486. (Bretton Wade) wrote:
  1487.  
  1488. (snip)
  1489.  
  1490. > I'd be surprised if Apple write protected the screen any time soon. I
  1491. > think this because Apple is trying very hard to get game developers to
  1492. > make games on the mac (sells machines, you know), and the recent push in
  1493. > the Win95 world to put out a package that gives direct screen access. Game
  1494. > developers want screen access.
  1495.  
  1496. Supposing they do. I was thinking how I would fix my own game to take care
  1497. of this. I came up with 2 solutions.
  1498.  
  1499. 1. Use CopyBits for everything. This would basically involve a total
  1500. rewrite, since everything I have is optimised around the blitters. All my
  1501. sprite handling routines and sprite movement patterns are intended with my
  1502. blitters in mind.
  1503.  
  1504. 2. Carry on as I am, but instead of drawing directly to the screen, Set up
  1505. another GWorld, and draw 'directly' to this. Then after all the drawing is
  1506. done, CopyBits this entire GWorld to the screen.
  1507.  
  1508. It sounds like (2) loses all the advantages of direct screen access (i.e.
  1509. speed), but on reflection it isn't so bad. After all, it's only on 68030
  1510. machines that I really need those extra few fps. Any hypothetical machines
  1511. which might not allow direct screen access will be based on PowerPC chips,
  1512. and so will not have any problems (speedwise) with one full-screen
  1513. CopyBits per frame.
  1514.  
  1515. So, does anyone (Ron ???) want to tell me why this would not work? If I
  1516. know now, I can start thinking about other ways to get around this
  1517. possible (although IMO unlikely) problem.
  1518.  
  1519.  
  1520. (snip)
  1521.  
  1522. thanks
  1523.  
  1524. Mark
  1525.  
  1526. - ------------------------------------------------------------------
  1527. Mark C Elliott                           elliott@mpi-muelheim.mpg.de
  1528. Max-Planck-Institut                      voice: (+49) 208 306 2429
  1529. Fuer Kohlenforschung
  1530. Muelheim, Germany
  1531. - ------------------------------------------------------------------
  1532.  
  1533. +++++++++++++++++++++++++++
  1534.  
  1535. >From "Andrew C. Plotkin" <erkyrath+@CMU.EDU>
  1536. Date: Fri, 15 Dec 1995 12:23:24 -0500
  1537. Organization: Carnegie Mellon, Pittsburgh, PA
  1538.  
  1539. elliott@mpi-muelheim.mpg.de (Mark Elliott) writes:
  1540. > In article <bwade-1412950114550001@ppp.qualia.com>, bwade@qualia.com
  1541. > (Bretton Wade) wrote:
  1542. > Supposing they do. I was thinking how I would fix my own game to take care
  1543. > of this. I came up with 2 solutions.
  1544. > 1. Use CopyBits for everything. This would basically involve a total
  1545. > rewrite, since everything I have is optimised around the blitters. All my
  1546. > sprite handling routines and sprite movement patterns are intended with my
  1547. > blitters in mind.
  1548.  
  1549. Certainly a pain in the ass, and lots of small CopyBits may be
  1550. unacceptably slow. 
  1551.  
  1552. > 2. Carry on as I am, but instead of drawing directly to the screen, Set up
  1553. > another GWorld, and draw 'directly' to this. Then after all the drawing is
  1554. > done, CopyBits this entire GWorld to the screen.
  1555. > It sounds like (2) loses all the advantages of direct screen access (i.e.
  1556. > speed), but on reflection it isn't so bad. After all, it's only on 68030
  1557. > machines that I really need those extra few fps. Any hypothetical machines
  1558. > which might not allow direct screen access will be based on PowerPC chips,
  1559. > and so will not have any problems (speedwise) with one full-screen
  1560. > CopyBits per frame.
  1561.  
  1562. This is certainly workable. (I've done it, and gotten 18 fps for
  1563. 640x480x8 screens on PPC.)  You don't lose *all* the advantages, since
  1564. you're using your custom blitters for all the small sprites. If you
  1565. were counting on the optimization of not redrawing the whole screen
  1566. each time, you take a relative hit, though. (When I did it, it was for
  1567. a full-scrolling game, so I was redrawing the whole screen anyway.)
  1568.  
  1569. You were probably thinking of this already, but I will *again*
  1570. recommend having a user preference for direct screen access or
  1571. direct-to-gworld-then-CopyBits. And it's easy enough to code, since
  1572. the complicated drawing code is the same in both cases.
  1573.  
  1574. --Z
  1575.  
  1576. "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the borogoves..."
  1577.  
  1578. +++++++++++++++++++++++++++
  1579.  
  1580. >From y-tony@bu.edu (Yan Lee)
  1581. Date: 15 Dec 1995 23:04:09 GMT
  1582. Organization: Boston University
  1583.  
  1584. Mark Elliott (elliott@mpi-muelheim.mpg.de) wrote:
  1585. : In article <bwade-1412950114550001@ppp.qualia.com>, bwade@qualia.com
  1586. : (Bretton Wade) wrote:
  1587.  
  1588. : (snip)
  1589.  
  1590. : > I'd be surprised if Apple write protected the screen any time soon. I
  1591. : > think this because Apple is trying very hard to get game developers to
  1592. : > make games on the mac (sells machines, you know), and the recent push in
  1593. : > the Win95 world to put out a package that gives direct screen access. Game
  1594. : > developers want screen access.
  1595. : > 
  1596.  
  1597. : Supposing they do. I was thinking how I would fix my own game to take care
  1598. : of this. I came up with 2 solutions.
  1599.  
  1600. I had asked this before....how would apple deny us access to the screen?  
  1601. I remembered somebody saying that apple can deny access when protected 
  1602. memory is actually implemented in the system software, but then some 
  1603. fella from apple mentioned some reason why apple couldn't.  Any ideas?
  1604.  
  1605. Tony
  1606.  
  1607.  
  1608. +++++++++++++++++++++++++++
  1609.  
  1610. >From y-tony@bu.edu (Yan Lee)
  1611. Date: 16 Dec 1995 02:37:56 GMT
  1612. Organization: Boston University
  1613.  
  1614. Ron Hunsinger (hnsngr@sirius.com) wrote:
  1615. : In article <elliott-1112951926270001@mcmds.mpi-muelheim.mpg.de>,
  1616. : elliott@mpi-muelheim.mpg.de (Mark Elliott) wrote:
  1617.  
  1618. : > In article <hnsngr-1012950443410001@ppp017-sf2.sirius.com>,
  1619. : > hnsngr@sirius.com (Ron Hunsinger) wrote:
  1620. : > 
  1621. : > > In article <ericd-0612952016300001@slip13.nilenet.com>,
  1622. : > > ericd@ra.nilenet.com (Eric A. Drumbor) wrote:
  1623. : > > 
  1624. : > > >      I *must* copy directly to the screen.>
  1625. : > > 
  1626. : > > No you don't. You can use CopyBits.
  1627. : > 
  1628. : > Oh come on Ron. Apple have published guidelines for direct-to-screen drawing.
  1629.  
  1630. : The only published guidelines I have seen from Apple is "don't do it".
  1631.  
  1632.  
  1633. Check out _develop_ issue #11, page 59.  August, 1992.
  1634.  
  1635.  
  1636. : > Direct to screen drawing is not dangerous. Yeah, I am sure that some
  1637. : > hardware configurations (eg. strange graphics accelerators) MIGHT cause
  1638. : > problems. However, after the initial teething troubles (which are
  1639. : > certainly not unique to vram access) I have had essentially NO crashes. I
  1640. : > have tested my game on a wide range of 68K and powerpc macs with a fair
  1641. : > selection of monitor sizes.
  1642.  
  1643. : Change MIGHT to WILL.
  1644.  
  1645. : Have you tested your games on the Macs that will be coming out 5 years from now?
  1646.  
  1647.  
  1648. My guess is that for 68k there wouldnt be much change.  Didnt apple say 
  1649. that system 7.5 is the last system that would work for 68k macs?  Anwyas, 
  1650. as long as there is an option to do "copybits mode,"  he will be safe.
  1651.  
  1652.  
  1653. Tony
  1654.  
  1655.  
  1656.  
  1657. +++++++++++++++++++++++++++
  1658.  
  1659. >From jmunkki@beta.hut.fi (Juri Munkki)
  1660. Date: 16 Dec 1995 12:46:26 GMT
  1661. Organization: Helsinki University of Technology
  1662.  
  1663. In article <4asut9$aqv@news.bu.edu> y-tony@bu.edu (Yan Lee) writes:
  1664. >I remembered somebody saying that apple can deny access when protected 
  1665. >memory is actually implemented in the system software, but then some 
  1666. >fella from apple mentioned some reason why apple couldn't.  Any ideas?
  1667.  
  1668. They would take a performance hit every time QuickDraw was used, because
  1669. they would have to "unprotect" the frame buffer bfeore QD could access it.
  1670. It makes more sense to run QD as a user level process.
  1671.  
  1672. I think they only possible scenario where screen frame buffer access was
  1673. denied is an accelerated graphics card that wants to do all of the drawing
  1674. itself. Usually though even these cards allow access to the frame buffer
  1675. even though it is slower than using the accelerator. I guess an incompatible
  1676. card doesn't sell all that well.
  1677.  
  1678. -- 
  1679. Juri Munkki jmunkki@iki.fi              Life is easy when polygons are cheap.
  1680. http://www.iki.fi/~jmunkki                 Windsurfing: Faster than the wind.
  1681.  
  1682. +++++++++++++++++++++++++++
  1683.  
  1684. >From rickgenter@aol.com (RickGenter)
  1685. Date: 16 Dec 1995 11:54:22 -0500
  1686. Organization: America Online, Inc. (1-800-827-6364)
  1687.  
  1688. >>>
  1689. This is certainly workable. (I've done it, and gotten 18 fps for
  1690. 640x480x8 screens on PPC.)
  1691. <<<
  1692.  
  1693. On a 7100/66, a raw blit of 640x480x8 has a maximum theoretical rate of
  1694. 114 fps. I've gotten 113 (obviously with no gameplay). The limiting factor
  1695. is VRAM speed, not processor speed.
  1696.  
  1697. Rick Genter
  1698. Technical Lead, IndyCar Racing II
  1699. Papyrus Design Group, Inc.
  1700.  
  1701. +++++++++++++++++++++++++++
  1702.  
  1703. >From briw@leland.Stanford.EDU (brian williams)
  1704. Date: 16 Dec 1995 10:40:59 -0800
  1705. Organization: Stanford University, CA 94305, USA
  1706.  
  1707.  
  1708. Eric A. Drumbor <ericd@ra.nilenet.com> wrote:
  1709. >     I'm not surprised it beat your routine, but your case simply doesn't
  1710. >apply to my situation.  I've written my own routine (a full screen
  1711. >blitter) and found it to be only slightly faster (if at all) when copying
  1712. >a large Rect, I wasn't surprised in the least.  Another good example of
  1713. >this is my polygon rasterizing routine (which draws directly into a
  1714. >GWorld).  When drawing smaller (150 x 150 square for instance) polygons,
  1715. >I'm getting over three times the speed that FillPoly would produce.  On
  1716. >the other side, my routine is only about 5% faster than FillPoly when
  1717. >filling an 832 x 624 screen.  In this case, the overhead of FillPoly is
  1718. >still hurting the speed, but the actual rasterizing is now the major
  1719. >bottleneck, and both routines share this bottleneck.  Of course, most of
  1720. >the polygons I draw aren't filling the screen, and the fact that my
  1721. >routine cuts out the overhead that is involved when filling a polygon in
  1722. >QuickDraw means that my frame rate will at least double on average, if not
  1723. >triple.  This is where the overhead comes into play, and the same goes for
  1724. >CopyBits, when COPYING SEVERAL SMALL REGIONS.  Ahem...
  1725. >
  1726. >     If I was copying a large area (or even < 12 smaller areas, like a
  1727. >32x32 square) there would be no two ways about it, CopyBits would be used
  1728. >(and IS an option in this game).  However, the overhead of making a few
  1729. >hundred calls to it per frame is what is killing the speed.  I don't see
  1730. >why this point has eluded you through my previous message.  It's NOT the
  1731. >actual copying speed of CopyBits (I shouldn't need to point this out!),
  1732. >it's the overhead involved in calling it in the first place, along with
  1733. >the checks for ctSeed, etc.  I've been a firm believer in CopyBits for all
  1734. >my offscreen->screen blits, and I've even taken a similar stance to your
  1735. >own, but this situation is different.  This time I'd like to find a happy
  1736. >alternative, besides providing CopyBits as a solution (again, the user has
  1737. >a choice).  I want the highest frame rate possible while keeping the
  1738. >system stable, period.
  1739. >
  1740.  
  1741.         I just wanted to give you game developers another reason why
  1742. should ALWAYS have a copybits mode.  I used a nice little test program
  1743. called TimeVideo to see how fast my video was and saw something
  1744. interesting.  On my 7200/90 I got the following results
  1745.  
  1746. 8-bit dacs. 832x624 pixels. 
  1747. pixel size                         8    16    32     bits     
  1748. CopyBits data rate                33.40 34.13 34.30  MB/s     
  1749. CopyBitsQuickly data rate         17.38 17.30 17.18  MB/s     
  1750.  
  1751.         CopyBitsQuickly is a handcoded blitter (which is native for the
  1752. ppc).  It does in fact get slightly better results than copybits on an
  1753. 8100/80, 840av and 950 (and least the machines that I tried it on).  But
  1754. on my 7200, copybits is twice as fast!  (and faster than any other machine
  1755. I tried, including a 9500/132 with an ATI card).
  1756.  
  1757.         I'll bet they're not making use of the 64-bit datapath to VRAM
  1758. somehow and it should only require a small change to their blitter,  but
  1759. again copybits takes care of it automatically.
  1760.  
  1761. (Descent really flies on my machine!)
  1762.  
  1763.         I'm not saying you shouldn't have direct-to-screen, just that you
  1764. should always have support for copybits, or else you cut your self off
  1765. from all future enhancements.
  1766.  
  1767. --Brian
  1768.  
  1769. +++++++++++++++++++++++++++
  1770.  
  1771. >From hnsngr@sirius.com (Ron Hunsinger)
  1772. Date: Sat, 16 Dec 1995 13:14:53 -0800
  1773. Organization: ErsteSoft
  1774.  
  1775. In article <ericd-1012951005250001@slip19.nilenet.com>,
  1776. ericd@ra.nilenet.com (Eric A. Drumbor) wrote:
  1777.  
  1778. > In article <hnsngr-1012950443410001@ppp017-sf2.sirius.com>,
  1779. > hnsngr@sirius.com (Ron Hunsinger) wrote:
  1780. > > >      I *must* copy directly to the screen.>
  1781. > > 
  1782. > > >      What are the odds this puppy will crash?
  1783. > > 
  1784. > > 100%. Guaranteed. Sorry to sound so pessimistic, but some of us still have
  1785. > > the battle scars from ignoring Apple's advice not to write directly to the
  1786. > > screen. It's good advice. Heed it.
  1787. > > 
  1788. > > Video memory will not always be memory mapped. Even if it is, it will not
  1789. > > always be writable. As memory protection improves (as it must if Apple
  1790. > > wants to make these machines more robust), VRAM won't always be in your
  1791. > > process' address space, even if it remains in the machine's address space.
  1792. >      This is what I wanted to hear (an answer to my question).  Thank you,
  1793. > Ron, at least for this part.  The rest, well....
  1794.  
  1795. You're welcome.
  1796.  
  1797. As for the rest, well... I'm sorry you thought I was being caustic. I
  1798. certainly didn't mean it that way. I really am trying to be helpful.
  1799.  
  1800. But you started out with a conclusion, instead of a question.
  1801.  
  1802. So I answered your question, and tried to get you to understand that your
  1803. conclusion should be questioned.
  1804.  
  1805. Why was I so emphatic? Because I, too, once thought that I *had to* copy
  1806. directly to the screen to get decent performance. I wrote a lot of
  1807. programs for the Plus that did just that. Then the Mac II came out and
  1808. they all broke. In the post-mortem analysis, I realized that my biggest
  1809. mistake was ignoring Apple's advice not to write directly to the screen.
  1810.  
  1811. I was already composing my images in an offscreen buffer (GWorlds hadn't
  1812. been invented yet) and doing selective copying to the screen. I could have
  1813. fixed the off-screen => on-screen copy routines. After all, that was the
  1814. only part that broke. But someone posted that CopyBits could do that well
  1815. enough, and I was about to reply that, of course not, the overhead in
  1816. CopyBits was way too high to make that a serious consideration.
  1817.  
  1818. Before saying that, though, I thought I'd set up some benchmarks to test
  1819. it, so I'd have some hard numbers to back me up. I described one such
  1820. benchmark (a full-screen copy on a Plus), but there were others. What I
  1821. found, to my surprise, was that CopyBits was not as much slower as I had
  1822. thought, and in some (admittedly pathologic) cases was actually even
  1823. faster.
  1824.  
  1825. And I had to admit to myself that even where CopyBits wasn't the fastest,
  1826. it had a number of advantages, that I tried to convey to you. The biggest
  1827. was that it was a single routine that would work on all hardware, past,
  1828. present, and future.
  1829.  
  1830. > > CopyBits will always be able to write to the screen, even when the day
  1831. > > comes that you can't.
  1832. >      I know this, my original question wasn't about CopyBits, it was about
  1833. > using an alternate method.  Of course, what you've said here doesn't
  1834. > actually answer this question either, does it?
  1835.  
  1836. Your original *conclusion* was that you had to write directly to the
  1837. screen. I think this does address that rather directly.
  1838.  
  1839. Correct me if I'm wrong, but doesn't "write directly to the screen" mean
  1840. "without letting QuickDraw do it"?
  1841.  
  1842. It may be that I've been giving undue emphasis to CopyBits at the expense
  1843. of all the other graphics routines. That is, you could also use FillPoly,
  1844. PaintRect, LineTo, and all the myriad other QuickDraw routines. I've been
  1845. saying "CopyBits" where perhaps I should have been saying "QuickDraw", so
  1846. my admonition is "Do all your VRAM updating with QuickDraw" rather than
  1847. "Do it all with CopyBits".
  1848.  
  1849. The reason for that emphasis is that I still have in mind the model for
  1850. how I manipulate an image with lots of sprites: build a frame where the
  1851. user can't see it, then make it all visible at once. I wouldn't dream of
  1852. doing the first part with QuickDraw; that's much too slow. For the second
  1853. part, CopyBits is all you need, so it turns out that CopyBits is the only
  1854. QuickDraw routine I call (after setup, of course) and I really don't see
  1855. any of the others being useful.
  1856.  
  1857. And I see you having problems down the road addressing the screen. Just
  1858. like some of us had when the Mac II came out. You can be as clever a
  1859. programmer as you want, but there was no way to anticipate the need for
  1860. SwapMMUMode. In fact, right up until the end, Apple swore up and down that
  1861. addresses would never be bigger than 24 bits. Just ask T/Maker (writers of
  1862. WriteNow).
  1863.  
  1864. And I guessed wrong about how color would be implemented. (Before the Mac
  1865. II, color was planar. With the Mac II, it suddenly and unexpectedly became
  1866. chunky.) 
  1867.  
  1868. I did guess right about page flipping, so I wasn't getting everything
  1869. wrong. I realized that page flipping was incompatible with the Window
  1870. Manager, and there was no way Apple would give up windowing, so page
  1871. flipping had to go.
  1872.  
  1873. The next hurdle will probably be protection. Just a guess, of course. I
  1874. could be wrong again. If you want to take the chance, go ahead. But if I'm
  1875. right, then *every* non-QuickDraw alternative will fail.
  1876.  
  1877. >      I'm not surprised it beat your routine, but your case simply doesn't
  1878. > apply to my situation. 
  1879.  
  1880. You're not? I sure was!
  1881.  
  1882. > Another good example of
  1883. > this is my polygon rasterizing routine (which draws directly into a
  1884. > GWorld).
  1885.  
  1886. I heartily endorse any tricks you want to use in your own GWorlds. That's
  1887. your memory, and the whole idea is that you can manipulate it to your
  1888. heart's content.
  1889.  
  1890. > This is where the overhead comes into play, and the same goes for
  1891. > CopyBits, when COPYING SEVERAL SMALL REGIONS.  Ahem...
  1892.  
  1893. So don't use CopyBits when copying several small regions. I probably
  1894. wouldn't use it at all when copying TO my offscreen area. I'm only
  1895. suggesting it for the final copy to the screen, at which time you will
  1896. copy a few moderate sized rectangles.
  1897.  
  1898. > I don't see
  1899. > why this point has eluded you through my previous message. 
  1900.  
  1901. Likewise.
  1902.  
  1903. > It's NOT the
  1904. > actual copying speed of CopyBits (I shouldn't need to point this out!),
  1905. > it's the overhead involved in calling it in the first place, along with
  1906. > the checks for ctSeed, etc.  I've been a firm believer in CopyBits for all
  1907. > my offscreen->screen blits, and I've even taken a similar stance to your
  1908. > own,
  1909.  
  1910. Then we're in agreement. The choice of rectangle size will, of course, be
  1911. a tradeoff between excessive calls (too small) and excessive copying (too
  1912. large).
  1913.  
  1914. > but this situation is different.  This time I'd like to find a happy
  1915. > alternative, besides providing CopyBits as a solution (again, the user has
  1916. > a choice).  I want the highest frame rate possible while keeping the
  1917. > system stable, period.
  1918.  
  1919. What bothers me is the large number of games I bought for my Plus that
  1920. won't run on later machines. That *really* annoys me. It's a black mark
  1921. against those companies that influences my future buying decisions,
  1922. assuming the company is even in business. 
  1923.  
  1924. As long as you make it an option, though, it should be OK. But in that
  1925. case, I guess I don't understand your question. It isn't that copying to
  1926. the screen is *hard*.
  1927.  
  1928. >      I'm not trying to make an enemy of you Ron,
  1929.  
  1930. Nor I of you.
  1931.  
  1932. > but you're way out in
  1933. > left field on this one.  I'm only trying to establish whether or not
  1934. > there's a way to safely access VRAM.  Would it have been so difficult to
  1935. > answer that particular question, and then mention the good reasons not to
  1936. > try this?  Apparently so.  
  1937.  
  1938. Again, I'm really sorry if I came across too heavy. I thought I was doing
  1939. just what you suggest: telling you that no, in my opinion there isn't a
  1940. safe way to access VRAM, and then mentioning what I think are good
  1941. reasons.
  1942.  
  1943. I'm really trying to be helpful, and thought (still think, in fact) that I
  1944. was doing so.
  1945.  
  1946. >      Let's wrap this up. 
  1947.  
  1948. Fine with me.
  1949.  
  1950. > I feel (and some others have acknowledged this,
  1951. > but NOT RON!! I make no claims as to what Ron's opinion is on anything!)
  1952. > that writing directly to video ram works, but isn't guranteed to work on
  1953. > all machines, or *any* future Macs or video cards.  When correctly using
  1954. > the ability to draw directly to video, higher frame rates can be achieved
  1955. > if an only if the method doesn't crash the machine...in that case, the
  1956. > method doesn't work, which basically means you're getting 0 (zero) frames
  1957. > per second :-)  This method should only be used as an option that can be
  1958. > set by the user.  This allows the user to play the game even if the BAAAD
  1959. > wittle VRAM blitter is mean and nasty, and doesn't share the
  1960. > blocks...especially the blue ones.
  1961.  
  1962. Although I am puzzled when yet again you jab at me and then say exactly
  1963. what I said.
  1964.  
  1965. -Ron Hunsinger
  1966.  
  1967. +++++++++++++++++++++++++++
  1968.  
  1969. >From kbs3387@silver.sdsmt.edu (Kevin Stone)
  1970. Date: 16 Dec 1995 23:53:09 GMT
  1971. Organization: South Dakota School of Mines and Technology
  1972.  
  1973. : This is certainly workable. (I've done it, and gotten 18 fps for
  1974. : 640x480x8 screens on PPC.)
  1975. : <<<
  1976. : On a 7100/66, a raw blit of 640x480x8 has a maximum theoretical rate of
  1977. : 114 fps. I've gotten 113 (obviously with no gameplay). The limiting factor
  1978. : is VRAM speed, not processor speed.
  1979.  
  1980.     The guy who was only getting 18 must have not had ForeColor as Black 
  1981. and BackColor as White, or the source and destination rectangles were 
  1982. different sizes.
  1983.     I can confirm getting around 100 FPS on my 7100-66, 640x480x8-bit.  
  1984.  
  1985. BAS
  1986.  
  1987.  
  1988. +++++++++++++++++++++++++++
  1989.  
  1990. >From ericd@ra.nilenet.com (Eric A. Drumbor)
  1991. Date: Sat, 16 Dec 1995 21:25:33 -0700
  1992. Organization: BW Software
  1993.  
  1994. In article <hnsngr-1612951314530001@ppp032-sf2.sirius.com>,
  1995. hnsngr@sirius.com (Ron Hunsinger) wrote:
  1996.  
  1997. > As for the rest, well... I'm sorry you thought I was being caustic. I
  1998. > certainly didn't mean it that way. I really am trying to be helpful.
  1999.  
  2000.      Could've fooled me.  Well, I guess you did fool me ;-)
  2001.  
  2002. > But you started out with a conclusion, instead of a question.
  2003. > So I answered your question, and tried to get you to understand that your
  2004. > conclusion should be questioned.
  2005.  
  2006.      Not quite.  I mentioned the possibility of the crashing based on
  2007. rumors and accounts from experienced programmers, and I knew that certain
  2008. games still used 
  2009. this technique (drawing to the VRAM), so I assumed that there was some
  2010. info out there to the contrary of the stories I heard about the crashing. 
  2011. Hence my question, hence my confusion when you decided to get into the
  2012. spew about CopyBits.  Nothing more than that, really.
  2013. >
  2014. > Why was I so emphatic? Because I, too, once thought that I *had to* copy
  2015. > directly to the screen to get decent performance. I wrote a lot of
  2016. > programs for the Plus that did just that. Then the Mac II came out and
  2017. > they all broke. In the post-mortem analysis, I realized that my biggest
  2018. > mistake was ignoring Apple's advice not to write directly to the screen.
  2019.  
  2020.      Don't misunderstand my last reply to you.  I don't think you're at
  2021. all inexperienced.  Again, my question was based on the experiences of
  2022. people who have already been successful at using this little hack.
  2023.  
  2024. [snip]
  2025.  
  2026. > > > CopyBits will always be able to write to the screen, even when the day
  2027. > > > comes that you can't.
  2028. > > 
  2029. > >      I know this, my original question wasn't about CopyBits, it was about
  2030. > > using an alternate method.  Of course, what you've said here doesn't
  2031. > > actually answer this question either, does it?
  2032. > Your original *conclusion* was that you had to write directly to the
  2033. > screen. I think this does address that rather directly.
  2034. > Correct me if I'm wrong, but doesn't "write directly to the screen" mean
  2035. > "without letting QuickDraw do it"?
  2036.  
  2037.      My conclusion was based on my delta copying technique, not a full
  2038. blitter that you've been bringing up.  This seems to be the key element
  2039. that you're missing here, Ron.  I'm not asking about CopyBits, I'm asking
  2040. about direct access.  I know what I need/want to do here, Ron, really I
  2041. do.  I didn't think I had to give a full fledged explanation of how and
  2042. why I was doing this, besides the fact that I'm implementing a delta
  2043. copying method that's damned slow when using CopyBits.  
  2044.  
  2045.      I understand where you're coming from with CopyBits, but I'm simply
  2046. not asking about it.  My question which you were answering to (which
  2047. didn't make it in your reply) where I mentioned a "magic" function was
  2048. referring to getting a base address for the video memory.
  2049.  
  2050. [good info snipped]
  2051.  
  2052. > And I see you having problems down the road addressing the screen. Just
  2053. > like some of us had when the Mac II came out. You can be as clever a
  2054. > programmer as you want, but there was no way to anticipate the need for
  2055. > SwapMMUMode. In fact, right up until the end, Apple swore up and down that
  2056. > addresses would never be bigger than 24 bits. Just ask T/Maker (writers of
  2057. > WriteNow).
  2058. > And I guessed wrong about how color would be implemented. (Before the Mac
  2059. > II, color was planar. With the Mac II, it suddenly and unexpectedly became
  2060. > chunky.) 
  2061. > I did guess right about page flipping, so I wasn't getting everything
  2062. > wrong. I realized that page flipping was incompatible with the Window
  2063. > Manager, and there was no way Apple would give up windowing, so page
  2064. > flipping had to go.
  2065. > The next hurdle will probably be protection. Just a guess, of course. I
  2066. > could be wrong again. If you want to take the chance, go ahead. But if I'm
  2067. > right, then *every* non-QuickDraw alternative will fail.
  2068.  
  2069.      This is all very true, and I can see where you're coming from.  I
  2070. should mention here and now that the 3D engine I'm working on is PowerMac
  2071. only, for the moment.  Obviously this doesn't change the VRAM access
  2072. issue, but it cleans up the 32-bit problems (unless a 64-bit
  2073. implementation of a PPC would cause problems).
  2074.  
  2075. > >      I'm not surprised it beat your routine, but your case simply doesn't
  2076. > > apply to my situation. 
  2077. > You're not? I sure was!
  2078.  
  2079.      Did you use inline assembly, or did you write your entire
  2080. function/procedure in assembly?  If it's the former, I'm not surprised,
  2081. since I had a few problems myself.  If the latter, hell, I dunno.
  2082.  
  2083. [snip]
  2084.  
  2085. > > This is where the overhead comes into play, and the same goes for
  2086. > > CopyBits, when COPYING SEVERAL SMALL REGIONS.  Ahem...
  2087. > So don't use CopyBits when copying several small regions. I probably
  2088. > wouldn't use it at all when copying TO my offscreen area. I'm only
  2089. > suggesting it for the final copy to the screen, at which time you will
  2090. > copy a few moderate sized rectangles.
  2091.  
  2092.      Ah, but this is the whole point to a delta blitter, and the reason
  2093. why CopyBits doesn't cut it.  My main issue with this blitter is speed
  2094. (duh), but I won't get it using CopyBits.  More effective usage of
  2095. CopyBits yields better results (from 32 fps to 44 fps), but the delta
  2096. blitter has an even greater increase (about 76 fps; all this is on a
  2097. 6100/60 w/DRAM video BTW).  I want to provide the best frame rate I can,
  2098. because eventually I'm porting this to 68k and I *know* it's going to
  2099. suffer horribly unless I take care of all the details.  
  2100.  
  2101. > > I don't see
  2102. > > why this point has eluded you through my previous message. 
  2103. > Likewise.
  2104.  
  2105.      To shay (sp?).
  2106.  
  2107. [snip]
  2108.  
  2109. > What bothers me is the large number of games I bought for my Plus that
  2110. > won't run on later machines. That *really* annoys me. It's a black mark
  2111. > against those companies that influences my future buying decisions,
  2112. > assuming the company is even in business. 
  2113.  
  2114.      Well, that's more of a support issue isn't it?  Obviously it's
  2115. annoying to get a new Mac only to find that your favorite game crashes on
  2116. it, but if a company is willing to put in the time to find a
  2117. solution/workaround I don't see *too* much of a problem.  We could get
  2118. into this aspect a little more but, ugh, only if you really want to...
  2119.  
  2120. > As long as you make it an option, though, it should be OK. But in that
  2121. > case, I guess I don't understand your question. It isn't that copying to
  2122. > the screen is *hard*.
  2123.  
  2124.      I just didn't get into the little details, and I didn't see a point
  2125. in it.  I could've explained all kinds of things about my final
  2126. intentions, but I think that's a waste of time and bandwidth.  It's easier
  2127. to ask a question if someone just gets to the point instead of someone
  2128. babbling on.  I see my folly, next time I'll offer more information.
  2129.  
  2130. > Although I am puzzled when yet again you jab at me and then say exactly
  2131. > what I said.
  2132.  
  2133.      Heh, two things:
  2134.  
  2135. 1)  It wasn't a jab.  Honestly, Ron, it was a friendly "push".  Don't read
  2136. into it.
  2137.  
  2138. 2)  We agreed on the point that you brought up.  My original question was
  2139. based on my wondering why these companies were using a method deemed WRONG
  2140. by Apple and others.  I wanted to know if there was a way to get access to
  2141. VRAM without using QD, and as the title says, doing it "(Safely)".  Your
  2142. point is definitely nothing to ignore, I just wanted to know what the deal
  2143. was with accessing the VRAM on my.
  2144.  
  2145.      I'm tired, and Christmas shopping has me quite ragged, so let's agree
  2146. to agree, and agree to disagree.....or whatever.
  2147.  
  2148. -- 
  2149. "Once in a while, a naughty little boy loses it and comes after Santa"
  2150. Eric A. Drumbor      
  2151. ericd@ra.nilenet.com                 <http://www.nilenet.com/~ericd/>
  2152. BW Software
  2153.  
  2154. +++++++++++++++++++++++++++
  2155.  
  2156. >From hnsngr@sirius.com (Ron Hunsinger)
  2157. Date: Mon, 18 Dec 1995 14:41:06 -0800
  2158. Organization: ErsteSoft
  2159.  
  2160. In article <elliott-1512951256290001@mcmds.mpi-muelheim.mpg.de>,
  2161. elliott@mpi-muelheim.mpg.de (Mark Elliott) wrote:
  2162.  
  2163. > 2. Carry on as I am, but instead of drawing directly to the screen, Set up
  2164. > another GWorld, and draw 'directly' to this. Then after all the drawing is
  2165. > done, CopyBits this entire GWorld to the screen.
  2166. > It sounds like (2) loses all the advantages of direct screen access (i.e.
  2167. > speed), but on reflection it isn't so bad. After all, it's only on 68030
  2168. > machines that I really need those extra few fps. Any hypothetical machines
  2169. > which might not allow direct screen access will be based on PowerPC chips,
  2170. > and so will not have any problems (speedwise) with one full-screen
  2171. > CopyBits per frame.
  2172. > So, does anyone (Ron ???) want to tell me why this would not work? If I
  2173. > know now, I can start thinking about other ways to get around this
  2174. > possible (although IMO unlikely) problem.
  2175.  
  2176. That is, essentially, the solution I'm recommending. 
  2177.  
  2178. As I spelled out in an earlier post, you don't necessarily want to do a
  2179. single copybits for the whole screen. It may (depending on the game) be
  2180. better to divide the screen up into a number of smaller rectangles, and
  2181. selectively copybits only those rectangles that have changed. This gains
  2182. in a game like PacMan where the difference from one frame to the next is
  2183. typically in only a few parts of the screen. If you have a game like
  2184. Marathon where each frame is usually completely different from the next,
  2185. you would go ahead and copybits it in one operation.
  2186.  
  2187. Actually, there are a number of advantages to this approach (of drawing
  2188. offscreen and then copying (somehow) to the screen):
  2189.  
  2190.   a) It solves completely the problem of flicker. All you have to do to
  2191.      avoid flicker is follow one simple rule: never put on the screen 
  2192.      anything you don't want the user to see.
  2193.  
  2194.      For example, if you want to move a sprite, the naive way is:
  2195.          Erase it from its old position (by copying background over it)
  2196.          Draw it in the new position.
  2197.  
  2198.      If you do that on the screen, though, you get flicker because the
  2199.      first step (erasing) involves drawing something (the absence of the
  2200.      sprite) that you don't want the user to see.
  2201.  
  2202.      If you do it offscreen, there's no problem. You don't copy the
  2203.      image to the screen until both the erasure and the redraw have been
  2204.      done. (If you're copying selectively, remember that both the
  2205.      erasure and the redraw are changes.)
  2206.  
  2207.   b) You probably have more than one sprite, and they can probably 
  2208.      overlap. To make this look right, you have to erase all your sprites, 
  2209.      then draw them all in their new position. To make the overlap look
  2210.      right, you have to draw them in back-to-front order. This is not 
  2211.      likely to be the same as top-to-bottom order, which is the order
  2212.      you want to update the screen in.
  2213.  
  2214.      Splitting the drawing into separate passes makes your logic a lot
  2215.      simpler. Simplicity usually (and does in this case) translate into
  2216.      speed. You've probably already done this anyway, and the only real
  2217.      issue is how you get your data from offscreen to onscreen.
  2218.  
  2219. Some people still suggest dealing with flicker by synchronizing to
  2220. vertical retrace, and doing all your drawing ahead of the electron beam.
  2221. In practice, that isn't practical. You would have to be able to do all
  2222. your erasing/drawing during vertical retrace time, which is only a
  2223. fraction of the frame time. 
  2224.  
  2225. If you could organize the drawing top-to-bottom, you could theoretically
  2226. get a little more time, because you don't have to be finished by the time
  2227. the beam starts drawing the top of the screen; you only have to stay ahead
  2228. of it. But if you have overlapping sprites, top-to-bottom isn't a natural
  2229. order to draw in. 
  2230.  
  2231. And even if it were, if your machine were fast enough (or your image
  2232. simple enough) to stay ahead of the beam, we wouldn't be having this
  2233. discussion. Not to mention that time spent waiting for VBL (assuming you
  2234. can beat it) is time wasted.
  2235.  
  2236. As long as your offscreen->onscreen copy is top-to-bottom, you aren't
  2237. going to get any flicker, even if you don't wait for VBL. As Forest Gump
  2238. would say, "One less thing to worry about."
  2239.  
  2240. So I've been assuming that people would draw offscreen first. The only
  2241. issue was, how to copy it onscreen quickly. The choices were: CopyBits, or
  2242. a custom copy routine.
  2243.  
  2244. I'm in favor of CopyBits, because it will always work, even on future
  2245. machines, and in the benchmarks I ran (admittedly several years ago) it
  2246. turned out that CopyBits is not all that slow IF USED JUDICIOUSLY.
  2247.  
  2248. Judiciously means:
  2249.  
  2250.    - you copy only rectangles that are nicely aligned (both source and 
  2251.      destination) to nice machine boundaries, so CopyBits won't have to
  2252.      do any masking or shifting.
  2253.  
  2254.    - your source and destination use the same color table, so CopyBits
  2255.      knows it doesn't have to translate colors. It only has to move pixels.
  2256.  
  2257.    - you copy as few rectangles as possible, subject to the contrary goal
  2258.      that you don't want the rectangles to be so large that they include
  2259.      too many pixels that haven't changed.
  2260.  
  2261.    - You don't copy anything twice. That is, you don't keep a list of
  2262.      sprite rectangles, and copy all of them -- that would copy the same
  2263.      data twice if sprites overlapped. Instead you keep a map of dirty
  2264.      (changed) rectangles, and copy those, once each. Where possible,
  2265.      combine adjacent rectangles, to minimize the number of calls.
  2266.  
  2267. If you follow those guidelines, I doubt that using CopyBits instead of a
  2268. custom copy routine will affect your frame rate by more than 5%. On some
  2269. machines, it may even be faster to use CopyBits than anything you can
  2270. write. 
  2271.  
  2272. Keep in mind that your offscreen drawing time will be greater than the
  2273. offscreen->onscreen copy time, since offscreen you do have to worry about
  2274. masking, shifting, clipping, colorizing, erasing, and all that good stuff.
  2275. This will dilute the significance of any relative difference in speed that
  2276. there may be in the to-screen copy.
  2277.  
  2278.  
  2279. I want to make it very clear (because apparently some people misunderstood
  2280. this) that the danger I see in writing directly to the screen is primarily
  2281. one of portability, to future machines, or to future operating systems.
  2282. (But see below.) I did not mean to suggest that a game that writes
  2283. directly to the screen might be unreliable or cause occasional random
  2284. crashes.
  2285.  
  2286. It either works or it doesn't. If it works on a particular machine, it
  2287. will keep working on that machine (hardware and software). Change either,
  2288. and it may fail, but it's not going to fail in the middle of a game. You
  2289. don't have to worry about someone reconfiguring the machine while you're
  2290. playing. (Except for the usual stuff -- pixel depths and maybe the
  2291. occasional Radius swivel -- that you have to worry about anyway.)
  2292.  
  2293. But your users will curse you if the game stops working because they
  2294. upgraded, whether it's to a new machine, or a new video card, or a new OS.
  2295. [Don't overlook that even an '030 has the hardware to write protect the
  2296. screen. It is possible than a new OS will use that capability. Not likely,
  2297. considering that Copeland may never run on an '030, and its successor
  2298. definitely won't. But possible.]
  2299.  
  2300. If you make it a preference, be sure your game can run long enough without
  2301. writing to the screen to reach the preference dialog. Don't, for example,
  2302. write directly to the screen to do any animation in your startup splash
  2303. screen, even if the preference says you can, because you may be restarting
  2304. from the crash that came right after the preference was set. Probably
  2305. obvious, but I just thought I'd mention it.
  2306.  
  2307. CopyBits does solve a few software compatibility problems, even on current
  2308. hardware and OS:
  2309.  
  2310.      The user can put the game into the background and let it continue
  2311.      playing. Not useful for most games, but think about SimCity. This 
  2312.      will force CopyBits to start clipping around foreground windows, but
  2313.      it already knows how to do that. There's no point in you reinventing
  2314.      that wheel. If the user doesn't like the slowdown, they'll know what
  2315.      to do about it.
  2316.  
  2317.      The user can even put a window in front of the game window and still
  2318.      play. I've seen utilities that put floating palettes in front of
  2319.      all the windows on the screen. (The name "Desk Strip" comes to mind,
  2320.      but I don't know if that's right.) I don't use such things, but I know
  2321.      people who swear by them. You're compatible with such utilities if
  2322.      you use CopyBits, because CopyBits knows to clip around windows that
  2323.      you don't even know are there. 
  2324.  
  2325.      It even knows to "clip around" screen savers. Of course, there's a
  2326.      Gestalt you can use to detect when a screen saver has kicked in,
  2327.      but not all screen savers use it. And the real point of this point
  2328.      is that CopyBits (actually, the Window Manager) will know about weird 
  2329.      stuff like this without your having to worry about. With CopyBits,
  2330.      you've covered bases you haven't even thought of.
  2331.  
  2332. -Ron Hunsinger
  2333.  
  2334. +++++++++++++++++++++++++++
  2335.  
  2336. >From hebert@prism.uvsq.fr (Renaud HEBERT)
  2337. Date: 19 Dec 1995 12:28:07 GMT
  2338. Organization: Lab. PRiSM, Universite de Versailles-Saint Quentin, France
  2339.  
  2340. In article <hnsngr-1812951441060001@ppp037-sf2.sirius.com>, hnsngr@sirius.com (Ron Hunsinger) writes:
  2341. |> In article <elliott-1512951256290001@mcmds.mpi-muelheim.mpg.de>,
  2342. |> elliott@mpi-muelheim.mpg.de (Mark Elliott) wrote:
  2343. [things cut]
  2344. |> As long as your offscreen->onscreen copy is top-to-bottom, you aren't
  2345. |> going to get any flicker, even if you don't wait for VBL. As Forest Gump
  2346. |> would say, "One less thing to worry about."
  2347. True, no flicker but I think that you can have some tearing ie you have two
  2348. different frames on the screen at the same time.
  2349. Does anyone know if people don't notice this "tearing" or does it look ugly ?
  2350.  
  2351. -- 
  2352. Renaud HEBERT          E-mail: Renaud.Hebert@prism.uvsq.fr
  2353. Serveur WWW:        http://www.prism.uvsq.fr
  2354. "Si utiliser un avion, c'est voler, alors utiliser un bateau c'est nager.
  2355. Si vous voulez sentir l'élément, sortez du véhicule." Bonne chute! 
  2356.  
  2357.  
  2358.  
  2359.  
  2360. +++++++++++++++++++++++++++
  2361.  
  2362. >From al@crucible.powertools.com (Al Evans)
  2363. Date: 19 Dec 1995 07:57:31 -0600
  2364. Organization: Powertools, Austin, Texas
  2365.  
  2366. In article <4b6b4n$jgn@soleil.uvsq.fr>,
  2367. Renaud HEBERT <hebert@prism.uvsq.fr> wrote:
  2368.  
  2369. [in response to a long post from Ron Hunsinger, with which I agree in
  2370. almost every detail...]
  2371.  
  2372. >True, no flicker but I think that you can have some tearing ie you have two
  2373. >different frames on the screen at the same time.
  2374. >Does anyone know if people don't notice this "tearing" or does it look ugly ?
  2375.  
  2376. This is a theoretical possibility, but in years of staring at screens
  2377. during the development of Graphic Elements, I am not sure I have ever
  2378. seen it. It certainly has never seemed an adequate reason for waiting
  2379. up to 12 ms or so for the next vertical blanking interrupt.
  2380.  
  2381. >Renaud HEBERT         E-mail: Renaud.Hebert@prism.uvsq.fr
  2382. >Serveur WWW:        http://www.prism.uvsq.fr
  2383. >"Si utiliser un avion, c'est voler, alors utiliser un bateau c'est nager.
  2384. >Si vous voulez sentir l'élément, sortez du véhicule." Bonne chute! 
  2385.  
  2386. Euh...on sait bien nager sans bateau, mais voler sans avion? Je passe.
  2387.  
  2388.                                         --Al Evans--
  2389. -- 
  2390. |||| Al Evans -- al@powertools.com -- proud of Graphic Elements Release 3 ||||
  2391. ====  A new standard for high-performance interactive Macintosh graphics  ====
  2392. ====         Available from mac.archive.umich.edu and mirrors in          ====
  2393. ||||        /mac/development/libraries/graphicelements3.0.sit.hqx         ||||
  2394.  
  2395. +++++++++++++++++++++++++++
  2396.  
  2397. >From dwareing@adelaide.on.net (David Wareing)
  2398. Date: Mon, 18 Dec 1995 02:19:10 +0930
  2399. Organization: Weyland Yutani
  2400.  
  2401. In article <hnsngr-1312950809410001@ppp037-sf2.sirius.com>,
  2402. hnsngr@sirius.com (Ron Hunsinger) wrote:
  2403.  
  2404. >> > >      I *must* copy directly to the screen.>
  2405. >> > 
  2406. >> > No you don't. You can use CopyBits.
  2407. >> 
  2408. >> Oh come on Ron. Apple have published guidelines for direct-to-screen drawing.
  2409. >
  2410. >The only published guidelines I have seen from Apple is "don't do it".
  2411.  
  2412. I respect your views on the subject Ron, and I do realise that you 
  2413. are only reiterating what we should all know and practice, but the
  2414. (sad) fact of the matter is that Apple doesn't write games, nor have
  2415. they presented a viable alternative for game/multimedia programmers.
  2416.  
  2417. (BTW Apple, where's the Game Dev home page? Microsoft is showing you
  2418. up. And give us a scaled down version of QD3D while you're at it. Oh,
  2419. and you might want to do something about the incredibly lacklustre 
  2420. Pippin home page too. Whine finished.)
  2421.  
  2422. CopyBits is a generic solution for general problems. Yep, it's very
  2423. nifty and can do things our custom blitters couldn't hope to do, but
  2424. that's part of the problem -- it does too much. People use their
  2425. own solutions for speed reasons, especially when many small copies
  2426. are required. There's just no way that CopyBits is going to be able
  2427. to beat a custom blitter in a game like Swoop (sorry for the plug 
  2428. but I didn't want to speak for other people) on a low end machine
  2429. without hardware acceleration. Could Swoop be incompatible on next
  2430. year's Macs? Sure, there is that risk. But in the mean time, it will
  2431. will run at a decent clip on last year's Macs. I did err in not providing
  2432. a "QuickDraw only" option in Swoop, but my future work will rectify
  2433. that oversight.
  2434.  
  2435. >> Direct to screen drawing is not dangerous. Yeah, I am sure that some
  2436. >> hardware configurations (eg. strange graphics accelerators) MIGHT cause
  2437. >> problems. However, after the initial teething troubles (which are
  2438. >> certainly not unique to vram access) I have had essentially NO crashes. I
  2439. >> have tested my game on a wide range of 68K and powerpc macs with a fair
  2440. >> selection of monitor sizes.
  2441. >
  2442. >Change MIGHT to WILL.
  2443. >
  2444. >Have you tested your games on the Macs that will be coming out 5 years
  2445. from now?
  2446.  
  2447. Have you Ron? :-)  We can worry about the future all we like, but our
  2448. games have to run at respectable speeds right here and now. If you're
  2449. writing a full screen copy game then I can see how it would be very,
  2450. very wise to use GWorlds and CopyBits, but I can't see the advantages
  2451. if you're writing a sprite-based affair that needs to run on older
  2452. machines.
  2453.  
  2454. [snip]
  2455.  
  2456. >> I have disassembled many action games. In almost all cases, games which
  2457. >> are highly rated (eg. the Ambrosia games) use direct to screen drawing. I
  2458. >> have yet to see one of these games crash.
  2459. >
  2460. >They will. Not on the machines that they are running on (obviously). But
  2461. >they won't run on the machines that will be on the market in five years.
  2462. >Nor on a Mac II, at least not at first.
  2463.  
  2464. Are you sure about that last statement?
  2465.  
  2466. >Getting the base address is nice. That's what we did on the early
  2467. >machines. We didn't call it GetBaseAddr, of course. We called it
  2468. >screenBits.baseAddress, and for all anyone knew at the time, that (and the
  2469. >rest of screenBits) was all you needed to know. Ask anybody. They'd tell
  2470. >you. That was how you did it, and it was perfectly safe.
  2471. >
  2472. >Except for Apple, of course. Those wet blankets kept saying "Don't write
  2473. >to the screen. Your program will crash on future Macs." But hey, what did
  2474. >they know? And what's that you say about "device list", "pixMap", and all
  2475. >that? We didn't worry about things like that, because things like that
  2476. >hadn't been invented yet.
  2477.  
  2478. Don't get confused about the intentions of people who are bypassing
  2479. CopyBits. I think that most people would *much* prefer to use Apple's
  2480. API rather than roll their own code. The problem is that Apple's code,
  2481. as I stated above, is not up to spec for certain requirements. If Apple
  2482. wants to bring out a "DirectDraw" SDK that is actually usable, then I'll
  2483. be the first in line to use the sucker. But until they do, their
  2484. warnings re compatibility are falling on less than sympathetic ears.
  2485.  
  2486. A similar situation existed with the old Sound Driver. How many people
  2487. do you think really wanted to write their own solution? I sure wouldn't
  2488. have. I'd rather use Apple's, but that only became a realistic option
  2489. when SM 3.0 was released. Note that I'm not saying CopyBits is technically
  2490. equivalent to the old Sound Manager. I'm saying that there's a time to
  2491. give CopyBits a big miss.
  2492.  
  2493. >What things are you overlooking that haven't been invented yet?
  2494.  
  2495. Umm, a version of Open Transport that works? A MacOS with protected
  2496. memory? An Apple Virtual Memory that works quickly and efficiently?
  2497.  :-) ;-)
  2498.  
  2499. [snip]
  2500.  
  2501. >> Okay, very good advice about CopyBits, but what about the situations where
  2502. >> CopyBits is not fast enough. Direct to screen drawing can be much faster.
  2503. >> For a sprite game (which is what I am writing) you generally know what
  2504. >> sort of movement your sprites will have, and how best to handle them.
  2505. >> Depending on your game, there are a huge number of optimisations you can
  2506. >> make.
  2507. >
  2508. >I accept that direct-to-screen may be a little faster, but I don't believe
  2509. >that it's going to be a lot faster.
  2510.  
  2511. I can say with religious certainty that the drawing loop in Swoop runs
  2512. at *least* *twice* as fast as the *optimised* CopyBits method on an
  2513. 030. And since Swoop spends most of its time in that drawing loop...
  2514.  
  2515. BTW, Ron, how exactly would you go about drawing several thousand 
  2516. stars to the screen (followed by erasing them by looking up their
  2517. old values and substitution) on a low end Mac? In real time please. ;-)
  2518.  
  2519. All warnings duly noted, but it's still horses for courses, IMO. I
  2520. won't be whining about incompatibility if Swoop breaks on new Macs
  2521. (though I might be whining if Apple still haven't got their act 
  2522. together in the software dept).
  2523.  
  2524. -- 
  2525. David Wareing                                 dwareing@adelaide.on.net
  2526. Belair, South Australia           http://www.AmbrosiaSW.com/~dwareing/
  2527. Macintosh Games & Multimedia Programming
  2528.  
  2529.  
  2530. +++++++++++++++++++++++++++
  2531.  
  2532. >From Karl_A._Bunker@maceast.com (Karl A. Bunker)
  2533. Date: Wed, 20 Dec 95 12:26:11 EDT
  2534. Organization: MacEAST
  2535.  
  2536. > True, no flicker but I think that you can have some tearing ie you have two
  2537. > different frames on the screen at the same time.
  2538. > Does anyone know if people don't notice this "tearing" or does it look ugly
  2539. ?
  2540.  
  2541. It depends on the type of animation, or more specifically, the type of sprite
  2542. movment. If a sprite has a lot of fast horizontal movement, tearing can become
  2543. a real problem, because that's when the top and bottom pieces of the sprite
  2544. will be markedly offset from each other. This is assuming that the sprite is
  2545. unfortunate enough to have its drawing interrupted by a screen-refresh, so
  2546. that it gets drawn in two sections.
  2547.  
  2548. Karl Bunker
  2549.  
  2550.  
  2551. --
  2552.  
  2553. - ---------------------
  2554. via MacEAST, Boston
  2555. http://www.maceast.com/
  2556.  
  2557. +++++++++++++++++++++++++++
  2558.  
  2559. >From Jim Lloyd <jim@melongem.com>
  2560. Date: 21 Dec 1995 02:05:19 GMT
  2561. Organization: MelonGem Productions
  2562.  
  2563. In article <4b6b4n$jgn@soleil.uvsq.fr> Renaud HEBERT,
  2564. hebert@prism.uvsq.fr writes:
  2565. >In article <hnsngr-1812951441060001@ppp037-sf2.sirius.com>, hnsngr@sirius.com >(Ron Hunsinger) writes:
  2566. >|> In article <elliott-1512951256290001@mcmds.mpi-muelheim.mpg.de>,
  2567. >|> elliott@mpi-muelheim.mpg.de (Mark Elliott) wrote:
  2568. >[things cut]
  2569. >|> As long as your offscreen->onscreen copy is top-to-bottom, you aren't
  2570. >|> going to get any flicker, even if you don't wait for VBL. As Forest Gump
  2571. >|> would say, "One less thing to worry about."
  2572. >True, no flicker but I think that you can have some tearing ie you have two
  2573. >different frames on the screen at the same time.
  2574. >Does anyone know if people don't notice this "tearing" or does it look ugly ?
  2575.  
  2576. Yes, you can get tearing even if you compose each frame offscreen and
  2577. render in one CopyBits.  If you have any sprites that have a high
  2578. horizontal velocity,
  2579. the tearing can be quite noticable (and annoying).
  2580.  
  2581. Jim Lloyd
  2582. jim@melongem.com
  2583.  
  2584. +++++++++++++++++++++++++++
  2585.  
  2586. >From dwareing@adelaide.on.net (David Wareing)
  2587. Date: Sun, 24 Dec 1995 12:58:00 +0930
  2588. Organization: Weyland Yutani
  2589.  
  2590. In article <4av3rr$gk8@elaine32.Stanford.EDU>, briw@leland.Stanford.EDU
  2591. (brian williams) wrote:
  2592.  
  2593. >        I just wanted to give you game developers another reason why
  2594. >should ALWAYS have a copybits mode.  I used a nice little test program
  2595. >called TimeVideo to see how fast my video was and saw something
  2596. >interesting.  On my 7200/90 I got the following results
  2597. >
  2598. >8-bit dacs. 832x624 pixels. 
  2599. >pixel size                         8    16    32     bits     
  2600. >CopyBits data rate                33.40 34.13 34.30  MB/s     
  2601. >CopyBitsQuickly data rate         17.38 17.30 17.18  MB/s     
  2602.  
  2603. Now do it for 50 rects, each 32x32 or smaller...
  2604.  
  2605. Or, try plotting 10000 random points to the screen...
  2606.  
  2607. -- 
  2608. David Wareing                                 dwareing@adelaide.on.net
  2609. Belair, South Australia           http://www.AmbrosiaSW.com/~dwareing/
  2610. Macintosh Games & Multimedia Programming
  2611.  
  2612.  
  2613. +++++++++++++++++++++++++++
  2614.  
  2615. >From stahl@kingsnet.com (K. & G. Stahl)
  2616. Date: 27 Dec 1995 06:05:22 GMT
  2617. Organization: InfoNet Communications
  2618.  
  2619.  
  2620. > In article <4b6b4n$jgn@soleil.uvsq.fr> Renaud HEBERT,
  2621. > hebert@prism.uvsq.fr writes:
  2622. > >True, no flicker but I think that you can have some tearing ie you have two
  2623. > >different frames on the screen at the same time.
  2624. > >Does anyone know if people don't notice this "tearing" or does it look ugly ?
  2625.  
  2626. Tearing does look ugly.  Just think of half the screen being one frame and
  2627. the other half being another with a "tear" in between.  The only time I
  2628. have visibly noticed tearing was large images or sprites.  With small
  2629. reasonable speed sprites any small "tears" are not sync'd with other
  2630. sprites so one does not notice.  I has been meantioned that fast
  2631. horizontal movement can make the bottom half of the torn sprite out on
  2632. line with the top.  One can test this with a vertical bar moving
  2633. horizontally in response to mouse movement.  It should be trival to make a
  2634. tear visible.  
  2635.   I feel if one is reasonably careful in implementing their blitter (using
  2636. the suggestions in this thread) that tearing is a small problem that can
  2637. be dealt with if it appears on a case by case basis.  Waiting for VBL's is
  2638. just a waste of time since you cannot draw fast enough to keep ahead of it
  2639. and that is lost time you could be doing more cool things...
  2640.  
  2641. Just my 2 sense
  2642.  
  2643. Regards,
  2644. Geoff Stahl
  2645. Dog Star Development
  2646. stahl@kingsnet.com
  2647.  
  2648. ---------------------------
  2649.  
  2650. >From emiltin@inet.uni-c.dk (Emil Tin)
  2651. Subject: ANSWER: Get dirID from FSSpec
  2652. Date: Sat, 23 Dec 1995 14:09:18 +0200
  2653. Organization: News Server at UNI-C, Danish Computing Centre for Research and Education.
  2654.  
  2655. After downloading the MoreFiles 1.4 Apple Sample Code (se previous posts),
  2656. I modified one of the routines to get from a FSSpec describing a directory
  2657. to that directory's dirID. Here's the C++ code:
  2658.  
  2659. The GetFolderDirID.cp:
  2660.  
  2661. //
  2662. // Get a folders directory ID from its FSSpec.
  2663. // Based on the Apple Sample Code, MoreFiles 1.4.
  2664. //
  2665. //                                     ◊ Emil Tin    95.12.23 ◊
  2666. //
  2667.  
  2668. #include "GetFolderDirID.h"
  2669.  
  2670. OSErr GetFolderDirID (FSSpec& folder, long& resultDirID)
  2671. {
  2672.    CInfoPBRec  pb;
  2673.    Str31    tempName;
  2674.    OSErr    error;
  2675.  
  2676.    if( (folder.name == NULL) || (folder.name[0] == 0) )     //Protection
  2677. against File Sharing problem
  2678.    {
  2679.       tempName[0] = 0;
  2680.       pb.dirInfo.ioNamePtr    =  tempName;
  2681.       pb.dirInfo.ioFDirIndex  =  -1;            //use ioDirID
  2682.    }
  2683.    else
  2684.    {
  2685.       pb.dirInfo.ioNamePtr    =  folder.name;
  2686.       pb.dirInfo.ioFDirIndex  =  0;          //use ioNamePtr and ioDirID
  2687.    }
  2688.    
  2689.    pb.dirInfo.ioVRefNum       =  folder.vRefNum;
  2690.    pb.dirInfo.ioDrDirID       =  folder.parID;
  2691.    
  2692.    error = PBGetCatInfoSync( &pb );
  2693.    
  2694.    resultDirID          =  pb.dirInfo.ioDrDirID;
  2695.    
  2696.    if( !((pb.dirInfo.ioFlAttrib & ioDirMask) != 0) )
  2697.       return dirNFErr;                    //not a folder!
  2698.    
  2699.    return error;
  2700. }
  2701.  
  2702. - ----
  2703. The GetFolderDirID.h file:
  2704.  
  2705. //
  2706. // Get a folders directory ID from its FSSpec.
  2707. // Based on the Apple Sample Code, MoreFiles 1.4.
  2708. // 
  2709. //                                     ◊ Emil Tin    95.12.23 ◊
  2710. //
  2711.  
  2712. #pragma once
  2713.  
  2714.  
  2715. OSErr GetFolderDirID    (FSSpec& folder, long& resultDirID);
  2716.  
  2717. ---------------------------
  2718.  
  2719. >From user@portal.dx.net (jeremyj)
  2720. Subject: Animation Libraries
  2721. Date: 20 Dec 1995 00:25:11 -0500
  2722. Organization: DataXchange Network
  2723.  
  2724. Hey everybody, got a question for ya!
  2725.  
  2726. I just finished reading through the docs of SAT (Ingemar, since I know 
  2727. you're listening, great work!), and it has left me thinking that there 
  2728. have to be more libraries out there, 'specially those that I can use in 
  2729. Pascal (I know C now, but I can't afford a compiler and hate translating 
  2730. source code). Are there any libraries anybody has or know of that do 
  2731. vector graphics (like in Arashi) polygon graphics (like in Xwing) and/or 
  2732. scrolling graphics systems? SAT *can* scroll graphics, but is there 
  2733. anything out there that can do it faster (is it even possible to do it at 
  2734. a reasonable rate?).
  2735.  
  2736. Please post your results here; don't just email me. This is stuff anybody 
  2737. can benefit from. Oh, and don't try to email me at the address above; 
  2738. look below.
  2739.  
  2740. -JRJ
  2741. jrj@ring.com
  2742.  
  2743. :)
  2744.  
  2745. +++++++++++++++++++++++++++
  2746.  
  2747. >From Tom Lakovic <lakovic@sfu.ca>
  2748. Date: 20 Dec 1995 19:28:13 GMT
  2749. Organization: Simon Fraser University
  2750.  
  2751. Yes, Christian Franz has written a vector graphix library called 3D 
  2752. GrafSys. Worth checking out, though I've never even been close to using 
  2753. it myself.
  2754.  
  2755. Tom.
  2756.  
  2757.  
  2758.  
  2759. +++++++++++++++++++++++++++
  2760.  
  2761. >From Ed Draper <draper@rpimail.mdacc.tmc.edu>
  2762. Date: 21 Dec 1995 14:39:05 GMT
  2763. Organization: U.T.M.D. Anderson Cancer Center
  2764.  
  2765. In article <4b86nn$a69@portal.dx.net> jeremyj, user@portal.dx.net writes:
  2766. >Please post your results here; don't just email me. This is stuff anybody 
  2767. >can benefit from. Oh, and don't try to email me at the address above; 
  2768. >look below.
  2769.  
  2770. I highly recommend ACL from Virtually Unlimited.  It's easy to use, fast,
  2771. cheap, and is loaded with features:
  2772.  
  2773. ftp://FTP.VIRTUALLY.MCNET.CH/virtually/acl/
  2774.  
  2775. You should find a demo on the CW7 CD.
  2776.  
  2777.  
  2778.       |E|J-  ED DRAPER
  2779.  rEpar|D|<-  The Levit Radiologic/Pathologic Institute
  2780.              The University of Texas M.D. Anderson Cancer Center
  2781.              mailto:draper@rpisun1.mda.uth.tmc.edu
  2782.              http://rpisun1.mda.uth.tmc.edu/
  2783.              http://www.blkbox.com/~draper/
  2784.  
  2785. +++++++++++++++++++++++++++
  2786.  
  2787. >From zzkbergm@dingo.uq.edu.au (Christoph Bergmann)
  2788. Date: Sun, 24 Dec 1995 12:36:48 +1000
  2789. Organization: University of Queensland
  2790.  
  2791. In article <4b86nn$a69@portal.dx.net>, Email replies are not possible to
  2792. this user wrote:
  2793.  
  2794. > source code). Are there any libraries anybody has or know of that do 
  2795. > vector graphics (like in Arashi) polygon graphics (like in Xwing) and/or 
  2796.  
  2797. there are a few 3d libs out there.. i dunno how well they rate but i've
  2798. seen them around..
  2799.  
  2800. > scrolling graphics systems? SAT *can* scroll graphics, but is there 
  2801. > anything out there that can do it faster (is it even possible to do it at 
  2802. > a reasonable rate?).
  2803.  
  2804. depends on what computer on. a pb180 (33mhz 030, 16greys) can handle
  2805. scrolling (1/2 - 3/4 screen size) no problems with well-written code..
  2806. even without using custom blitters. i wouldnt advise trying it on a slower
  2807. machine if u want good speed. also higher colour depths would slow it
  2808. down..
  2809. as to the library for it, i havent heard of any apart from sat and
  2810. spriteWorld or whatever its called. neither seem to have much scrolling
  2811. support from what i have seen of them.
  2812.  
  2813. ChrisB
  2814.  
  2815. +++++++++++++++++++++++++++
  2816.  
  2817. >From gordon@micron.net (Gordon Henriksen)
  2818. Date: 24 Dec 1995 18:12:44 GMT
  2819. Organization: Micron Internet Services
  2820.  
  2821. In article <zzkbergm-2412951236480001@zzkbergm.slip.cc.uq.oz.au>,
  2822. zzkbergm@dingo.uq.edu.au (Christoph Bergmann) wrote:
  2823.  
  2824. > In article <4b86nn$a69@portal.dx.net>, Email replies are not possible to
  2825. > this user wrote:
  2826. > > source code). Are there any libraries anybody has or know of that do 
  2827. > > vector graphics (like in Arashi) polygon graphics (like in Xwing) and/or 
  2828. > there are a few 3d libs out there.. i dunno how well they rate but i've
  2829. > seen them around..
  2830. > > scrolling graphics systems? SAT *can* scroll graphics, but is there 
  2831. > > anything out there that can do it faster (is it even possible to do it at 
  2832. > > a reasonable rate?).
  2833. > depends on what computer on. a pb180 (33mhz 030, 16greys) can handle
  2834. > scrolling (1/2 - 3/4 screen size) no problems with well-written code..
  2835. > even without using custom blitters. i wouldnt advise trying it on a slower
  2836. > machine if u want good speed. also higher colour depths would slow it
  2837. > down..
  2838. > as to the library for it, i havent heard of any apart from sat and
  2839. > spriteWorld or whatever its called. neither seem to have much scrolling
  2840. > support from what i have seen of them.
  2841.  
  2842. ACL provides extensive support for scrolling. ACL costs US$250.
  2843.  
  2844. > ChrisB
  2845.  
  2846.                       TTFN,
  2847.                         Gordon Henriksen
  2848.                         gordon@micron.net
  2849.  
  2850. +++++++++++++++++++++++++++
  2851.  
  2852. >From ingemar@lysator.liu.se (Ingemar Ragnemalm)
  2853. Date: 27 Dec 1995 09:56:00 GMT
  2854. Organization: (none)
  2855.  
  2856. user@portal.dx.net (jeremyj) writes:
  2857.  
  2858. >I just finished reading through the docs of SAT (Ingemar, since I know 
  2859. >you're listening, great work!),
  2860.  
  2861. Thanks!
  2862.  
  2863. >and it has left me thinking that there 
  2864. >have to be more libraries out there, 'specially those that I can use in 
  2865. >Pascal (I know C now, but I can't afford a compiler and hate translating 
  2866. >source code). Are there any libraries anybody has or know of that do 
  2867. >vector graphics (like in Arashi)
  2868.  
  2869. I actually made a Pascal interface for VAKit (Arashis reusable parts) once.
  2870. Now, where did I put it...
  2871.  
  2872. >polygon graphics (like in Xwing)
  2873.  
  2874. 3DGM could fit the bill - though it doesn't come with a Pascal interface
  2875. yet.
  2876.  
  2877. >and/or 
  2878. >scrolling graphics systems? SAT *can* scroll graphics, but is there 
  2879. >anything out there that can do it faster (is it even possible to do it at 
  2880. >a reasonable rate?).
  2881.  
  2882. It is hard to scroll faster than SAT does - without scrolling in bigger
  2883. steps, of course. (Perhaps the scrolling demo would be more impressing if
  2884. I just bumped up the speed of the objects a little bit?) On low-end Macs,
  2885. step-scrolling is often preferrable. On new Macs, you can scroll pretty fast.
  2886.  
  2887. SAT's approach to smooth scrolling is simply to CopyBits from a part of
  2888. a large offscreen. You can, of course, fake scrolling by using starfields
  2889. (part of SAT since 2.3.5) or sprites, but that isn't the same.
  2890.  
  2891. --
  2892. - -
  2893. Ingemar Ragnemalm, PhD
  2894. Image processing, Mac shareware games
  2895. E-mail address: ingemar@isy.liu.se or ingemar@lysator.liu.se
  2896.  
  2897. +++++++++++++++++++++++++++
  2898.  
  2899. >From ingemar@lysator.liu.se (Ingemar Ragnemalm)
  2900. Date: 27 Dec 1995 10:10:13 GMT
  2901. Organization: (none)
  2902.  
  2903. Tom Lakovic <lakovic@sfu.ca> writes:
  2904.  
  2905. >Yes, Christian Franz has written a vector graphix library called 3D 
  2906. >GrafSys. Worth checking out, though I've never even been close to using 
  2907. >it myself.
  2908.  
  2909. I have been using parts of it for some 3D hacks I've been doing.
  2910.  
  2911. First of all, a library is missing from the 2.0 package. I got it directly
  2912. from Christian. It is included below.
  2913.  
  2914. The package is written using floating-point numbers. There is some fixed-
  2915. point support, but it is half-hearted (still using lots of floating-point
  2916. operations) and doesn't work right out of the box. This means that it
  2917. shouldn't be very fast on a 68LC040 (LC475, LC630...).
  2918.  
  2919. The package is worth getting only for the documentation. You can learn quite
  2920. a bit of 3D from it.
  2921.  
  2922. I use only the fundamental matrix operations, which I made run with
  2923. fixed-point.
  2924.  
  2925. /Ingemar Ragnemalm
  2926.  
  2927.  
  2928. --
  2929. - -
  2930. Ingemar Ragnemalm, PhD
  2931. Image processing, Mac shareware games
  2932. E-mail address: ingemar@isy.liu.se or ingemar@lysator.liu.se
  2933.  
  2934. +++++++++++++++++++++++++++
  2935.  
  2936. >From al@crucible.powertools.com (Al Evans)
  2937. Date: 27 Dec 1995 07:44:56 -0600
  2938. Organization: Powertools, Austin, Texas
  2939.  
  2940. In article <4br57g$7qn@newsy.ifm.liu.se>,
  2941. Ingemar Ragnemalm <ingemar@lysator.liu.se> wrote:
  2942.  
  2943. >user@portal.dx.net (jeremyj) writes:
  2944.  
  2945. >>SAT *can* scroll graphics, but is there 
  2946. >>anything out there that can do it faster (is it even possible to do it at 
  2947. >>a reasonable rate?).
  2948.  
  2949. >It is hard to scroll faster than SAT does - without scrolling in bigger
  2950. >steps, of course. (Perhaps the scrolling demo would be more impressing if
  2951. >I just bumped up the speed of the objects a little bit?) On low-end Macs,
  2952. >step-scrolling is often preferrable. On new Macs, you can scroll pretty fast.
  2953.  
  2954. Graphic Elements offers support for scrolling, presumably in somewhat
  2955. the same way as does SAT.
  2956.  
  2957. The *problem* with scrolling backgrounds is that, when the background is
  2958. scrolling, everything on the screen will have to be redrawn every frame.
  2959. This implies a fundamental rendering strategy in which you take for
  2960. granted one complete redraw per frame. However, the high performance of
  2961. Graphic Elements (and presumably SAT) is based on the assumption that
  2962. much of the disply will remain static from one frame to the next. When
  2963. this assumption is false (i.e., when the whole frame must be redrawn),
  2964. there is a small amount of additional overhead due to this now-false
  2965. assumption.
  2966.  
  2967. (Now *there* is an obtuse paragraph. Just read "...dirty rects become
  2968. irrelevant when all rects are dirty.")
  2969.  
  2970. >SAT's approach to smooth scrolling is simply to CopyBits from a part of
  2971. >a large offscreen. You can, of course, fake scrolling by using starfields
  2972. >(part of SAT since 2.3.5) or sprites, but that isn't the same.
  2973.  
  2974. As part of my "rewrite" of Cap'n Magneto, I made a scrolling pattern-based
  2975. "background map" Graphic Element. Performance was quite acceptable on
  2976. my Quadra 800. But to write a "modern" side-scroller, with 2 or 3 
  2977. planes scrolling at different rates and with transparency, would in my
  2978. opinion require a dedicated graphics engine.
  2979.  
  2980.                                         --Al Evans--
  2981. -- 
  2982. |||| Al Evans -- al@powertools.com -- proud of Graphic Elements Release 3 ||||
  2983. ====  A new standard for high-performance interactive Macintosh graphics  ====
  2984. ====         Available from mac.archive.umich.edu and mirrors in          ====
  2985. ||||        /mac/development/libraries/graphicelements3.0.sit.hqx         ||||
  2986.  
  2987. ---------------------------
  2988.  
  2989. >From Michele Fuortes <mfuortes@med.cornell.edu>
  2990. Subject: Changing the size of balloon help
  2991. Date: 27 Dec 1995 00:29:26 GMT
  2992. Organization: Cornell University Medical College
  2993.  
  2994. Hi everybody,
  2995.  
  2996. I'd like to add balloon help to my dialog windows, but I'm having
  2997. troubles with the sizes of the balloons.
  2998.  
  2999. I'd like a balloon to say:
  3000.  
  3001. Enter the list address here.
  3002. Something like:   WineLovers-L@cellar.wine.com
  3003.  
  3004. but the text gets broken down into:
  3005.  
  3006. Enter the list address
  3007. here.
  3008. Something like:   WineLovers-L@cellar.
  3009. wine.com
  3010.  
  3011. Which looks really ugly.
  3012. How do I force the line breaks that I want?
  3013. How do I change the size of the balloon?
  3014. I looked in InsideMac and there is something about "alternate rectangle"
  3015. but Resorceer does not same to be able to edit that field.
  3016.  
  3017. Help ?!?
  3018.  
  3019. Thanks
  3020.  
  3021. Michele
  3022.  
  3023. - --------------------------------------------------------------------
  3024. Michele Fuortes, MD/PhD
  3025. Cornell University Medical College
  3026. E-mail: mfuortes@med.cornell.edu
  3027.  
  3028. +++++++++++++++++++++++++++
  3029.  
  3030. >From resorcerer@aol.com (Resorcerer)
  3031. Date: 27 Dec 1995 00:34:52 -0500
  3032. Organization: America Online, Inc. (1-800-827-6364)
  3033.  
  3034. Michele -
  3035.  
  3036. >How do I force the line breaks that I want?
  3037. >How do I change the size of the balloon?
  3038. >I looked in InsideMac and there is something about "alternate rectangle"
  3039. >but Resorceer does not same to be able to edit that field.
  3040.  
  3041. Resorcerer lets you edit every field in any balloon help resource.  In any
  3042. case, you don't want to use any alternate rectangle field, and there's a
  3043. better solution.
  3044.  
  3045. When your message record(s) use 'TEXT' resources, or strings of various
  3046. kinds, the Help Manager chooses the balloon size and aspect ratio on its
  3047. own, and you don't have any control over the shape or choices of
  3048. word-breaks, etc.
  3049.  
  3050. However, if you use a 'PICT' message record, the Help Manager always sizes
  3051. the balloon according to the dimensions of the 'PICT'.  Unfortunately,
  3052. most 'PICT's are screen dumps that use a whole lot of space, and if you
  3053. are only trying to display text balloons, this quickly gets out of hand.
  3054.  
  3055. Resorcerer has a solution for all of this in that you can use the
  3056. 'TEXT'/'styl' editor to enter the text of a message (including setting any
  3057. typefaces and colors), and then choose the command in the Text Menu that
  3058. creates a text-only 'PICT' resource that will display the same text in a
  3059. 'PICT' that has the same size as the Text Editor's editing area.  This
  3060. 'PICT' is not a screen dump, but instead is a recording of just the text,
  3061. font, and color information.  You can then use this picture in a 'PICT'
  3062. help message record.
  3063.  
  3064. The only possible downside to doing this is that you don't want to use any
  3065. wild fonts that might not be on your user's machine, since the 'PICT'
  3066. records the font name to use, but not the actual pixels of the text being
  3067. drawn.
  3068.  
  3069. Resorcerer has several balloon help messages that are quite large (see the
  3070. balloon for the Color Icon Editor's Lasso Tool) and these are presented as
  3071. text-only 'PICT's, which take up very little extra room over a standard
  3072. 'TEXT' resource.
  3073.  
  3074. Hope this helps.
  3075.  
  3076. Doug McKenna
  3077. Mathemaesthetics, Inc.
  3078. Developers of Resorcerer
  3079. (303) 440-0707
  3080.  
  3081. ---------------------------
  3082.  
  3083. >From owenh@harlequin.com (Owen Hartnett)
  3084. Subject: Need to unlock MF Temp Memory?
  3085. Date: Fri, 22 Dec 1995 21:06:04 GMT
  3086. Organization: Harlequin, Inc.
  3087.  
  3088. Think Reference says that when using MF Temp Memory, you need to unlock it
  3089. between WNE calls. Is there any reason for doing this other than making
  3090. the free Multifinder heap more compactable? 
  3091.  
  3092. To restate: Is there any *mandatory* reason the MF Temp memory needs to be
  3093. unlocked over WNE calls?
  3094.  
  3095. -Owen
  3096.  
  3097. +++++++++++++++++++++++++++
  3098.  
  3099. >From stk@berlin.snafu.de (Stefan Kurth)
  3100. Date: Sat, 23 Dec 1995 02:43:07 +0100
  3101. Organization: none
  3102.  
  3103. Owen Hartnett <owenh@harlequin.com> wrote:
  3104.  
  3105. > To restate: Is there any *mandatory* reason the MF Temp memory needs to be
  3106. > unlocked over WNE calls?
  3107.  
  3108. NIM:Memory requires it, in a very clear language:
  3109.  
  3110.     "You must never lock temporary memory across calls to GetNextEvent
  3111.      or WaitNextEvent."  (p. 2-10)
  3112.  
  3113. That should be reason enough.
  3114.  
  3115.  
  3116. -- 
  3117. Stefan Kurth
  3118. Berlin, Germany
  3119.  
  3120. +++++++++++++++++++++++++++
  3121.  
  3122. >From phils@bedford.symantec.com (Phil Shapiro)
  3123. Date: Sat, 23 Dec 1995 14:06:26 -0500
  3124. Organization: Symantec Corp.
  3125.  
  3126. In article <199512230243072287970@stk.berlin.snafu.de>,
  3127. stk@berlin.snafu.de (Stefan Kurth) wrote:
  3128.  
  3129. | Owen Hartnett <owenh@harlequin.com> wrote:
  3130. | > To restate: Is there any *mandatory* reason the MF Temp memory needs to be
  3131. | > unlocked over WNE calls?
  3132. | NIM:Memory requires it, in a very clear language:
  3133. |     "You must never lock temporary memory across calls to GetNextEvent
  3134. |      or WaitNextEvent."  (p. 2-10)
  3135. | That should be reason enough.
  3136.  
  3137. The reason NIM:Memory says this is because a locked handle can fragment
  3138. the Process Manager's heap, eg if the user switches out your app and
  3139. launches another while you've got your handle locked down.
  3140.  
  3141. In other words the OS won't crash if you do this, but it will probably not
  3142. be able to make efficient use of memory.
  3143.  
  3144.    -phil
  3145. -- 
  3146. Phil Shapiro                                 Senior Software Engineer
  3147. Development Tools Group                          Symantec Corporation
  3148.                      phils@bedford.symantec.com
  3149.  
  3150. +++++++++++++++++++++++++++
  3151.  
  3152. >From jwbaxter@olympus.net (John W. Baxter)
  3153. Date: Tue, 26 Dec 1995 21:21:23 -0800
  3154. Organization: Internet for the Olympic Peninsula
  3155.  
  3156. In article <phils-2312951406270001@155.64.60.59>,
  3157. phils@bedford.symantec.com (Phil Shapiro) wrote:
  3158.  
  3159. >The reason NIM:Memory says this is because a locked handle can fragment
  3160. >the Process Manager's heap, eg if the user switches out your app and
  3161. >launches another while you've got your handle locked down.
  3162. >
  3163. >In other words the OS won't crash if you do this, but it will probably not
  3164. >be able to make efficient use of memory.
  3165.  
  3166. And if the locked block happens to be at the very bottom of the Process
  3167. Manager heap, thus preventing expansion of the System heap when the System
  3168. wants it expanded, you can run into one of the silly bits of code in the
  3169. System which behave poorly (read:  crash) when they need more System heap
  3170. and can't get it.
  3171.  
  3172.    --John
  3173.  
  3174. -- 
  3175.   "This item is not available because it cannot be removed."
  3176. John W. Baxter    Port Ludlow, WA     jwbaxter@olympus.net
  3177.  
  3178. +++++++++++++++++++++++++++
  3179.  
  3180. >From phils@bedford.symantec.com (Phil Shapiro)
  3181. Date: Wed, 27 Dec 1995 12:07:54 -0500
  3182. Organization: Symantec Corp.
  3183.  
  3184. In article <jwbaxter-2612952121230001@ptpm012.olympus.net>,
  3185. jwbaxter@olympus.net (John W. Baxter) wrote:
  3186.  
  3187. | In article <phils-2312951406270001@155.64.60.59>,
  3188. | phils@bedford.symantec.com (Phil Shapiro) wrote:
  3189. | >The reason NIM:Memory says this is because a locked handle can fragment
  3190. | >the Process Manager's heap, eg if the user switches out your app and
  3191. | >launches another while you've got your handle locked down.
  3192. | >
  3193. | >In other words the OS won't crash if you do this, but it will probably not
  3194. | >be able to make efficient use of memory.
  3195. | And if the locked block happens to be at the very bottom of the Process
  3196. | Manager heap, thus preventing expansion of the System heap when the System
  3197. | wants it expanded, you can run into one of the silly bits of code in the
  3198. | System which behave poorly (read:  crash) when they need more System heap
  3199. | and can't get it.
  3200.  
  3201. Well, I have a lot of experience with code that locks handles on the MF
  3202. temp heap across WNE calls and I've never seen a crash due to it -- I use
  3203. HLockHi to prevent the problem you describe. (Now, do you want to trust
  3204. someone who admits that they have experience with code like this? :)
  3205.  
  3206.    -phil
  3207. -- 
  3208. Phil Shapiro                                 Senior Software Engineer
  3209. Development Tools Group                          Symantec Corporation
  3210.                      phils@bedford.symantec.com
  3211.  
  3212. ---------------------------
  3213.  
  3214. >From smmcdowe@undergrad.math.uwaterloo.ca (Sean McDowell)
  3215. Subject: New Mac games programming web site!
  3216. Date: Thu, 28 Dec 1995 01:49:58 GMT
  3217. Organization: University of Waterloo
  3218.  
  3219. In order to make myself semi-useful to the world at large, I have started 
  3220. a games programming site, <A HREF = 
  3221. "http://www.undergrad.math.uwaterloo.ca/~smmcdowe/Bitstop.html">Mac Games 
  3222. Programmers' Bitstop</A>. 
  3223.  
  3224. I am no HTML wizard, so things are pretty straightforward.
  3225.  
  3226. Do stop by and have a look. Any contributions of links or suggestions are 
  3227. welcome!
  3228.  
  3229. Sean
  3230. smmcdowe@undergrad.math.uwaterloo.ca
  3231.  
  3232. ---------------------------
  3233.  
  3234. >From Muff@winternet.com (MuffinHead)
  3235. Subject: Script Editor Apple Events
  3236. Date: Mon, 18 Dec 1995 19:37:28 -0600
  3237. Organization: Armpit Studios VIII
  3238.  
  3239.    Does anyone know the event (code, parms, etc) that is sent to Script
  3240. Editor so it will select the range of text after getting an error in an
  3241. applet? I haven't been able to locate documentation for this, nor could I
  3242. figure it out by spying on events.
  3243.  
  3244. MuffinHead
  3245. Drummer, Mac geek                                  Armpit Studios VIII
  3246. http://www.winternet.com/~muff/                    Plymouth, MN
  3247. ______________________________________________________________________
  3248. So I guess the moral here is: Never throw a used fuel pump from a
  3249. Russian rocket missile into Possum Lake.
  3250.   --Red Green
  3251.  
  3252. +++++++++++++++++++++++++++
  3253.  
  3254. >From jonpugh@netcom.com (Jon Pugh)
  3255. Date: Mon, 25 Dec 1995 07:17:31 GMT
  3256. Organization: Apple Computer
  3257.  
  3258. In article <Muff-1812951937280001@ppp-66-101.dialup.winternet.com>,
  3259. Muff@winternet.com (MuffinHead) wrote:
  3260.  
  3261. >   Does anyone know the event (code, parms, etc) that is sent to Script
  3262. >Editor so it will select the range of text after getting an error in an
  3263. >applet? I haven't been able to locate documentation for this, nor could I
  3264. >figure it out by spying on events.
  3265.  
  3266. It's an optional parameter on the odoc event.  It corresponds to the
  3267. kOSAErrorRange which you get from OSAScriptError call.  It's the same
  3268. record you get from that call.  Just add it to the odoc event with the
  3269. same keyword you used to get it from OSAScriptError.
  3270.  
  3271. As an aside, you need to decompile the script if the error range comes
  3272. back as 0,0 and then get the error range again since AppleScript doesn't
  3273. know the range until it has seen the text.
  3274.  
  3275. Jon
  3276.  
  3277. -- 
  3278. What are YOU doing to oppose the Microsoft juggernaut?
  3279.  
  3280. +++++++++++++++++++++++++++
  3281.  
  3282. >From Matt Slot <fprefect@umich.edu>
  3283. Date: 26 Dec 1995 03:04:13 GMT
  3284. Organization: University of Michigan
  3285.  
  3286. MuffinHead, Muff@winternet.com writes:
  3287.  >    Does anyone know the event (code, parms, etc) that is sent to Script
  3288.  > Editor so it will select the range of text after getting an error in an
  3289.  > applet? I haven't been able to locate documentation for this, nor could I
  3290.  > figure it out by spying on events.
  3291.  
  3292. Check out the reference for OSAScriptError() in NIM:Interapp. Comm, pg 10-37.
  3293. You need the "Error Range" selector, but to extract the data you will need to
  3294. explicitly coerce the returned descriptor into an AERecord.
  3295.  
  3296. Matt
  3297.  
  3298. * * * * * * * * * * * * * * * * * * * * * * * * * * ======================
  3299. *  Reality: Matt Slot                             *  Time is an illusion.
  3300. *  E-Mail:  mailto:fprefect@umich.edu             *  Lunchtime doubly so.
  3301. *  Web:     http://www.sils.umich.edu/~fprefect/  *     -- Douglas Adams
  3302. * * * * * * * * * * * * * * * * * * * * * * * * * * ======================
  3303.  
  3304. ---------------------------
  3305.  
  3306. >From jayfar@netaxs.com (Jay Farrell)
  3307. Subject: [ANN] Mops 2.7 Macintosh Programming Environment
  3308. Date: Sun, 24 Dec 1995 04:08:49 -0500
  3309. Organization: Jayfar's Web
  3310.  
  3311.  
  3312. Mops 2.7 is Michael Hore's public-domain development system for the
  3313. Macintosh. A powerful and robust hybrid of Forth and Smalltalk, Mops has
  3314. extensive OOP capabilities including multiple inheritance, and a class
  3315. library supporting the Macintosh interface.  Includes all source code and
  3316. Doug Hoffman's Quick Edit program.  Mops has been updated to incorporate
  3317. the latest Apple Universal Headers.
  3318.  
  3319. Mops is a fabulous language for getting down to the bare metal when you
  3320. want to, though fairly high level if you build on the supplied classes. 
  3321. It also includes 68k & PPC assemblers for writing your more time-critcal
  3322. methods.
  3323.  
  3324. Mops does not yet produce PPC native code (except from the aformentioned
  3325. PPC assembler) -- we expect it will be within the first half of the new
  3326. year.
  3327.  
  3328. You can test code interactively in the interpreter as you develop, and
  3329. then generate your optimized standalone app.  Mops and Mops apps will run
  3330. on even a Classic or SE, as well as on the newer Macs.
  3331.  
  3332. For the F.A.Q., the manual and tutorial, Mops itself, and other Mops
  3333. resources, see The Mops Page:
  3334.  
  3335.       <URL:http://www.netaxs.com/~jayfar/mops.html>
  3336.  
  3337. You'll also find Mops in the /dev directory at info-mac, with the manual
  3338. in /dev/info
  3339.  
  3340. Cheers,
  3341. Jayfar
  3342.  
  3343.    ////~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~////
  3344.   ////   The Mops Page    <URL:http://www.netaxs.com/~jayfar/mops.html>    ////
  3345.  ////~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~////
  3346. ////   Mops is Mike Hore's freeware Forth/Smalltalk hybrid for Macintosh ////
  3347. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  3348.   Jay Farrell     jayfar@netaxs.com        Philadelphia, Pennsylvania, USA
  3349.  
  3350. ---------------------------
  3351.  
  3352. End of C.S.M.P. Digest
  3353. **********************
  3354.  
  3355.  
  3356. Attachment converted: Stuff:GrafSys C lib/int.cpt (PACT/CPCT) (00001F87)
  3357.